0

以下是目标字符串。

July 17, 2007 –&lt;br> September 25, 2009 <br> June 2007 - July 2010

我正在尝试在<br>不跟随的标签之前添加换行符-。因此,生成的字符串应该是:

July 17, 2007 –&lt;br> September 25, 2009 \n<br> June 2007 - July 2010

我尝试了以下正则表达式无济于事。

re.sub(r'([^-])(\s*<br)',r'\1\n\2', astring)

给我

July 17, 2007 –\n<br> September 25, 2009\n <br> June 2007 - July 2010

解决办法是什么?

更新:

我实际上并没有用正则表达式解析 HTML。我知道 HTML + RegEx 组合会让我发疯。我已经在使用 lxml 来解析 HTML。但是,我无法理解的是为什么正则表达式无法捕捉到这种-\s*<模式。

4

2 回答 2

4

文本中的破折号是EN DASH U+2013,这就是([^-])匹配EN DASH并且发生替换的原因。

您需要将角色添加到您的角色类中,并将其转移\s*到第一个捕获组,然后添加\s到否定的角色类中以使其按您的意愿工作:

re.sub(r'([^\s–-]\s*)(<br)',r'\1\n\2', astring)

请注意,虽然上面的代码有效,但它是不可维护的——因为很难注意到EN DASH字符类中的 。

Python 3.3及更高版本开始,\u\U已添加 Unicode 转义序列。您可以这样指定您的正则表达式:

re.sub(r'([^\s\u2013-]\s*)(<br)',r'\1\n\2', astring)

可以说是不太清楚是什么\u2013,但至少,代码的读者不会被绊倒。

对于 Python 3.2 及更低版本,您可以使用普通文字字符串而不是原始文字字符串语法来实现正则表达式的相同效果。

re.sub('([^\\s\u2013-]\\s*)(<br)',r'\1\n\2', astring)

从技术上讲,由于 Python 解析文字字符串的方式(保留\if 它不形成有效的转义序列),'([^\s\u2013-]\s*)(<br)'也可以工作(比较\\s\s),但为了安全起见,我将转义加倍。

于 2013-04-24T15:13:45.923 回答
1
于 2013-04-24T15:10:31.647 回答