<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: ned-batchelder</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/ned-batchelder.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2025-03-30T22:48:15+00:00</updated><author><name>Simon Willison</name></author><entry><title>Quoting Ned Batchelder</title><link href="https://simonwillison.net/2025/Mar/30/ned-batchelder/#atom-tag" rel="alternate"/><published>2025-03-30T22:48:15+00:00</published><updated>2025-03-30T22:48:15+00:00</updated><id>https://simonwillison.net/2025/Mar/30/ned-batchelder/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://nedbatchelder.com/blog/202503/horseless_intelligence.html"&gt;&lt;p&gt;My advice about using AI is simple: use AI as an assistant, not an expert, and use it judiciously. Some people will object, “but AI can be wrong!” Yes, and so can the internet in general, but no one now recommends avoiding online resources because they can be wrong. They recommend taking it all with a grain of salt and being careful. That’s what you should do with AI help as well.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://nedbatchelder.com/blog/202503/horseless_intelligence.html"&gt;Ned Batchelder&lt;/a&gt;, Horseless intelligence&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ned-batchelder"&gt;ned-batchelder&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;&lt;/p&gt;



</summary><category term="ned-batchelder"/><category term="ai"/></entry><entry><title>Quoting Ned Batchelder</title><link href="https://simonwillison.net/2024/Jan/24/ned-batchelder/#atom-tag" rel="alternate"/><published>2024-01-24T18:25:21+00:00</published><updated>2024-01-24T18:25:21+00:00</updated><id>https://simonwillison.net/2024/Jan/24/ned-batchelder/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://nedbatchelder.com/blog/202401/you_probably_dont_need_to_learn_c.html"&gt;&lt;p&gt;Find a level of abstraction that works for what you need to do. When you have trouble there, look beneath that abstraction. You won’t be seeing how things really work, you’ll be seeing a lower-level abstraction that could be helpful. Sometimes what you need will be an abstraction one level up. Is your Python loop too slow? Perhaps you need a C loop. Or perhaps you need numpy array operations.&lt;/p&gt;
&lt;p&gt;You (probably) don’t need to learn C.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://nedbatchelder.com/blog/202401/you_probably_dont_need_to_learn_c.html"&gt;Ned Batchelder&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/abstractions"&gt;abstractions&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/c"&gt;c&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ned-batchelder"&gt;ned-batchelder&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/programming"&gt;programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;



</summary><category term="abstractions"/><category term="c"/><category term="ned-batchelder"/><category term="programming"/><category term="python"/></entry><entry><title>Quoting Ned Batchelder</title><link href="https://simonwillison.net/2020/Jun/28/ned-batchelder/#atom-tag" rel="alternate"/><published>2020-06-28T14:29:09+00:00</published><updated>2020-06-28T14:29:09+00:00</updated><id>https://simonwillison.net/2020/Jun/28/ned-batchelder/#atom-tag</id><summary type="html">
    &lt;blockquote cite="https://nedbatchelder.com/blog/202006/2500.html"&gt;&lt;p&gt;Here’s a common piece of advice from people who create things: to make better things, make more things. Not only does it give you constant practice at making things, but it gives you more chances at lucking into making a good thing.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="https://nedbatchelder.com/blog/202006/2500.html"&gt;Ned Batchelder&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ned-batchelder"&gt;ned-batchelder&lt;/a&gt;&lt;/p&gt;



</summary><category term="ned-batchelder"/></entry><entry><title>Internet explorer mystery #1376</title><link href="https://simonwillison.net/2008/Dec/3/ned/#atom-tag" rel="alternate"/><published>2008-12-03T09:04:17+00:00</published><updated>2008-12-03T09:04:17+00:00</updated><id>https://simonwillison.net/2008/Dec/3/ned/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://nedbatchelder.com/blog/200812/internet_explorer_mystery_1376.html"&gt;Internet explorer mystery #1376&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
IE executes function definitions inside an “if (0)” block. That frightens me.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/internet-explorer"&gt;internet-explorer&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ned-batchelder"&gt;ned-batchelder&lt;/a&gt;&lt;/p&gt;



</summary><category term="internet-explorer"/><category term="javascript"/><category term="ned-batchelder"/></entry><entry><title>280slides and Objective-J</title><link href="https://simonwillison.net/2008/Jun/7/ned/#atom-tag" rel="alternate"/><published>2008-06-07T16:09:37+00:00</published><updated>2008-06-07T16:09:37+00:00</updated><id>https://simonwillison.net/2008/Jun/7/ned/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://nedbatchelder.com/blog/200806/280slides.html"&gt;280slides and Objective-J&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
280 slides uses an Objective-C clone written in 13KB of JavaScript.  I have to admit I’m completely baffled as to why you would want to use Objective C instead of JavaScript, but evidently it worked fantastically well for them.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/280slides"&gt;280slides&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/compiler"&gt;compiler&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ned-batchelder"&gt;ned-batchelder&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/objective-c"&gt;objective-c&lt;/a&gt;&lt;/p&gt;



</summary><category term="280slides"/><category term="compiler"/><category term="javascript"/><category term="ned-batchelder"/><category term="objective-c"/></entry><entry><title>Apache proxy auto-re-loader</title><link href="https://simonwillison.net/2008/Feb/18/ned/#atom-tag" rel="alternate"/><published>2008-02-18T09:44:02+00:00</published><updated>2008-02-18T09:44:02+00:00</updated><id>https://simonwillison.net/2008/Feb/18/ned/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://nedbatchelder.com/blog/200802/apache_proxy_autoreloader.html"&gt;Apache proxy auto-re-loader&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Neat trick: set your 502 (Bad Gateway) error document to include a meta refresh tag, automating the refresh needed should a server you are proxying to be temporarily unavailable.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/apache"&gt;apache&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/metarefresh"&gt;metarefresh&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ned-batchelder"&gt;ned-batchelder&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/proxies"&gt;proxies&lt;/a&gt;&lt;/p&gt;



</summary><category term="apache"/><category term="metarefresh"/><category term="ned-batchelder"/><category term="proxies"/></entry><entry><title>Http-https transitions and relative URLs</title><link href="https://simonwillison.net/2007/Oct/18/ned/#atom-tag" rel="alternate"/><published>2007-10-18T11:57:47+00:00</published><updated>2007-10-18T11:57:47+00:00</updated><id>https://simonwillison.net/2007/Oct/18/ned/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.nedbatchelder.com/blog/200710.html#e20071017T215538"&gt;Http-https transitions and relative URLs&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Finally, a reason to use those weird protocol-relative URLs (//example.com/path and the like).


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/http"&gt;http&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/https"&gt;https&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ned-batchelder"&gt;ned-batchelder&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/urls"&gt;urls&lt;/a&gt;&lt;/p&gt;



</summary><category term="http"/><category term="https"/><category term="ned-batchelder"/><category term="urls"/></entry><entry><title>Stopping spambots with hashes and honeypots</title><link href="https://simonwillison.net/2007/Jan/23/spambots/#atom-tag" rel="alternate"/><published>2007-01-23T13:39:15+00:00</published><updated>2007-01-23T13:39:15+00:00</updated><id>https://simonwillison.net/2007/Jan/23/spambots/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.nedbatchelder.com/text/stopbots.html"&gt;Stopping spambots with hashes and honeypots&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Ned’s analysis of how spambots work, along with some relatively simple tricks that should fool most of them.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/commentspam"&gt;commentspam&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/hashing"&gt;hashing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ned-batchelder"&gt;ned-batchelder&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/spam"&gt;spam&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/spambots"&gt;spambots&lt;/a&gt;&lt;/p&gt;



</summary><category term="commentspam"/><category term="hashing"/><category term="ned-batchelder"/><category term="spam"/><category term="spambots"/></entry><entry><title>Subversion branching quick start</title><link href="https://simonwillison.net/2006/Oct/29/subversion/#atom-tag" rel="alternate"/><published>2006-10-29T15:27:29+00:00</published><updated>2006-10-29T15:27:29+00:00</updated><id>https://simonwillison.net/2006/Oct/29/subversion/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.nedbatchelder.com/text/quicksvnbranch.html"&gt;Subversion branching quick start&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Ned Batchelder’s branching tutorial.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/branching"&gt;branching&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ned-batchelder"&gt;ned-batchelder&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/subversion"&gt;subversion&lt;/a&gt;&lt;/p&gt;



</summary><category term="branching"/><category term="ned-batchelder"/><category term="subversion"/></entry><entry><title>Ned Batchelder: Css-discuss wiki</title><link href="https://simonwillison.net/2005/Feb/2/ned/#atom-tag" rel="alternate"/><published>2005-02-02T20:23:28+00:00</published><updated>2005-02-02T20:23:28+00:00</updated><id>https://simonwillison.net/2005/Feb/2/ned/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.nedbatchelder.com/blog/200502.html"&gt;Ned Batchelder: Css-discuss wiki&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Ned says nice things about the Wiki.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/css"&gt;css&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ned-batchelder"&gt;ned-batchelder&lt;/a&gt;&lt;/p&gt;



</summary><category term="css"/><category term="ned-batchelder"/></entry><entry><title>Python Parsing Tools</title><link href="https://simonwillison.net/2004/Nov/30/python/#atom-tag" rel="alternate"/><published>2004-11-30T14:53:06+00:00</published><updated>2004-11-30T14:53:06+00:00</updated><id>https://simonwillison.net/2004/Nov/30/python/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.nedbatchelder.com/text/python-parsers.html"&gt;Python Parsing Tools&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Ned’s compilation of Python parsing libraries.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://www.nedbatchelder.com/blog/20041128T190631.html"&gt;Ned Batchelder&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ned-batchelder"&gt;ned-batchelder&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;



</summary><category term="ned-batchelder"/><category term="python"/></entry><entry><title>Ned Batchelder: A quest for pythonic interfaces</title><link href="https://simonwillison.net/2004/Nov/10/batchelder/#atom-tag" rel="alternate"/><published>2004-11-10T01:03:20+00:00</published><updated>2004-11-10T01:03:20+00:00</updated><id>https://simonwillison.net/2004/Nov/10/batchelder/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.nedbatchelder.com/text/pythonic-interfaces.html"&gt;Ned Batchelder: A quest for pythonic interfaces&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
More Ned on interfaces.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ned-batchelder"&gt;ned-batchelder&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/object-oriented-programming"&gt;object-oriented-programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;



</summary><category term="ned-batchelder"/><category term="object-oriented-programming"/><category term="python"/></entry><entry><title>Ned Batchelder: Interfaces</title><link href="https://simonwillison.net/2004/Nov/10/ned/#atom-tag" rel="alternate"/><published>2004-11-10T01:03:05+00:00</published><updated>2004-11-10T01:03:05+00:00</updated><id>https://simonwillison.net/2004/Nov/10/ned/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.nedbatchelder.com/text/interfaces.html"&gt;Ned Batchelder: Interfaces&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Ned on interfaces.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ned-batchelder"&gt;ned-batchelder&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/object-oriented-programming"&gt;object-oriented-programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/programming"&gt;programming&lt;/a&gt;&lt;/p&gt;



</summary><category term="ned-batchelder"/><category term="object-oriented-programming"/><category term="programming"/></entry><entry><title>Code generation vs data driven programming</title><link href="https://simonwillison.net/2004/Feb/11/codeGeneration/#atom-tag" rel="alternate"/><published>2004-02-11T05:39:05+00:00</published><updated>2004-02-11T05:39:05+00:00</updated><id>https://simonwillison.net/2004/Feb/11/codeGeneration/#atom-tag</id><summary type="html">
    &lt;p&gt;Via &lt;a href="http://www.nedbatchelder.com/blog/200402.html#e20040210T222100" title="Code generation with Cog"&gt;Ned Batchelder&lt;/a&gt;, this &lt;a href="http://www.codegeneration.net/tiki-read_article.php?articleId=9"&gt;interview with pragmatic Dave Thomas&lt;/a&gt; on code generation closely reflects my own nascent thoughts on the issue:&lt;/p&gt;

&lt;blockquote cite="http://www.codegeneration.net/tiki-read_article.php?articleId=9"&gt;&lt;p&gt;&lt;strong&gt;CGN:&lt;/strong&gt; What do think the future is for code generation?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dave:&lt;/strong&gt; I think that in the long term the larger code generation efforts, the "application generators," will become a thing of the past. They are there because the underlying technologies and architectures don't yet support programming at a high level.  But I'm betting that languages such as Java and C++ will in the long term be seen as a curious branch in the evolution of computing. I'm hoping that somewhere out there some bright spark is coming up with a way of letting us write applications expressively and dynamically. Once this happens, the need for these kinds of code generators will diminish.&lt;/p&gt;

&lt;p&gt;For example, I rarely (if ever) write a code generator that generates Ruby code: there's just no need, as Ruby is dynamic enough to let be do what I want without leaving the language.&lt;/p&gt;

&lt;p&gt;In the shorter term, though, I think code generators of all kinds will continue to contribute significantly to the industry. Java and C# are both such stifling languages that you need to be able to use code generators to make them effective.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We considered using code generators for our current major project at work, and picked up Jack Herrington's &lt;a href="http://www.codegeneration.net/cgia/" title="Code Generation in Action"&gt;book&lt;/a&gt; on the subject. Reading through it, it became clear that many of the problems that code generators solve can be tackled instead using &lt;a href="/2003/Dec/05/dataDriven/" title="How not to use OOP"&gt;data driven programming techniques&lt;/a&gt; made possible by dynamic languages. Since we had already settled on Python as our implementation language the need for code generation became far less apparent, and we ended up avoiding it entirely with the exception of a command line tool for passively generating basic templates for our admin interface.&lt;/p&gt;

&lt;p&gt;If I ever have to work with a less expressive language I'll certainly consider using a code generator (probably written in Python) to abstract away some some of the tedious repetition. As it is, Python's rich data structures and clean support for introspection provide an excellent alternative.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/dave-thomas"&gt;dave-thomas&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ned-batchelder"&gt;ned-batchelder&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/programming"&gt;programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="dave-thomas"/><category term="django"/><category term="ned-batchelder"/><category term="programming"/><category term="python"/></entry><entry><title>Ned Batchelder: Showing C header structure</title><link href="https://simonwillison.net/2004/Feb/4/ned/#atom-tag" rel="alternate"/><published>2004-02-04T01:19:18+00:00</published><updated>2004-02-04T01:19:18+00:00</updated><id>https://simonwillison.net/2004/Feb/4/ned/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.nedbatchelder.com/blog/20040203T140829.html"&gt;Ned Batchelder: Showing C header structure&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Using Python to maked other languages less painful


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/c"&gt;c&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ned-batchelder"&gt;ned-batchelder&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;&lt;/p&gt;



</summary><category term="c"/><category term="ned-batchelder"/><category term="python"/></entry><entry><title>Ned Batchelder: handyxml</title><link href="https://simonwillison.net/2004/Jan/26/ned/#atom-tag" rel="alternate"/><published>2004-01-26T02:52:55+00:00</published><updated>2004-01-26T02:52:55+00:00</updated><id>https://simonwillison.net/2004/Jan/26/ned/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.nedbatchelder.com/code/modules/handyxml.html"&gt;Ned Batchelder: handyxml&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Yet another XML object wrapper for Python, this time with full DOM method support included


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ned-batchelder"&gt;ned-batchelder&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xml"&gt;xml&lt;/a&gt;&lt;/p&gt;



</summary><category term="ned-batchelder"/><category term="python"/><category term="xml"/></entry><entry><title>A better definition of Metadata</title><link href="https://simonwillison.net/2003/Oct/1/metadataDefinition/#atom-tag" rel="alternate"/><published>2003-10-01T11:17:24+00:00</published><updated>2003-10-01T11:17:24+00:00</updated><id>https://simonwillison.net/2003/Oct/1/metadataDefinition/#atom-tag</id><summary type="html">
    &lt;p&gt;Ned Batchelder: &lt;a href="http://www.nedbatchelder.com/text/metadata-is-nothing-new.html"&gt;Metadata is nothing new&lt;/a&gt;. Ned includes a far better definition of metadata than the standard "data about data" phrase:&lt;/p&gt;

&lt;blockquote cite="http://www.nedbatchelder.com/text/metadata-is-nothing-new.html"&gt;&lt;p&gt;
Metadata is information about a thing, apart from the thing itself.
&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Ned also offers clear examples of metadata in the real world and shows how the concept goes back thousands of years. If you still don't quite understand what the term means you won't have any excuses once you've read his article.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/metadata"&gt;metadata&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ned-batchelder"&gt;ned-batchelder&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="metadata"/><category term="ned-batchelder"/></entry><entry><title>Verbose Regular Expressions</title><link href="https://simonwillison.net/2003/Apr/11/verboseRegularExpressions/#atom-tag" rel="alternate"/><published>2003-04-11T03:01:15+00:00</published><updated>2003-04-11T03:01:15+00:00</updated><id>https://simonwillison.net/2003/Apr/11/verboseRegularExpressions/#atom-tag</id><summary type="html">
    &lt;p&gt;Ned Batchelder describes &lt;a href="https://nedbatchelder.com/blog/200304/verbose_python_regular_expressions.html"&gt;Verbose Python regular expressions&lt;/a&gt;. This is one of the things I've known about (as in known that they exist) for ages but have never got around to using. I've been working with some pretty heavy regular expressions recently that could really do with the clarity of being defined in verbose format with comments.&lt;/p&gt;

&lt;p&gt;&lt;acronym title="PHP: Hypertext Preprocessor"&gt;PHP&lt;/acronym&gt; also has support for verbose &lt;acronym title="Regular Expressions"&gt;REs&lt;/acronym&gt;, thanks to the excellent &lt;a href="http://www.php.net/manual/en/ref.pcre.php" title="PHP: Regular Expression Functions (Perl-Compatible)"&gt;pcre functions&lt;/a&gt;. Just use the 'x' modifier as explained on &lt;a href="http://www.php.net/manual/en/pcre.pattern.modifiers.php" title="PHP: Pattern Modifiers"&gt;this manual page&lt;/a&gt;.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ned-batchelder"&gt;ned-batchelder&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/php"&gt;php&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/python"&gt;python&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/regular-expressions"&gt;regular-expressions&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="ned-batchelder"/><category term="php"/><category term="python"/><category term="regular-expressions"/></entry></feed>