查找和替换中的python正则表达式

时间:2014-01-19 22:01:05

标签: python regex

我正在尝试编写正则表达式以在特定位置插入空格。我正在阅读html文件并试图在#WORD<tag之间插入一个空格,因此它会#WORD <

其中WORD是一个变量,可以是任何东西,只要它是一个真正的单词(字符串)

<p style="text-align: left;" data-redator="true"> #deeds</p><p style="text-align: left;" data-redator="true"></p><p style="text-align: left;" data-redator="true">this is it #$%$%$ dkfj dlkjf dklfj </p>

在上面的示例中,我想在#deeds</p>中插入一个空格,因此它将是#deeds </p>

我尝试使用字符串替换和re.sub,但我不知道如何在维护变量之间进行替换..

任何建议?

更新

我尝试了其中一个答案中提供的并且效果很好,但问题是它不能用于unicode字符。我尝试进行以下调整,它会选择英语单词而不是像阿拉伯语这样的unicode字符

re.sub(ur'(#\w+)(<)', ur'\1 \2', c, flags=re.UNICODE)
下面的

是html的一个例子

<p style="text-align: left;" data-redator="true"> #$^$%^</p><p style="text-align: left;" data-redator="true"></p><p style="text-align: left;" data-redator="true"> #sdkjf #الكويت</p><p style="text-align: left;" data-redator="true"></p><p style="text-align: left;" data-redator="true"></p>

有什么建议吗?我使用re.UNICODE标志并尝试在正则表达式之前使用ur来解析unicode ..但没有运气

2 个答案:

答案 0 :(得分:3)

由于您没有向我们展示您的模式,我会向您展示,并向您展示如何使其工作,并希望这将向您展示如何使您的真正的模式工作。

所以:

r = re.compile(r'#[a-z]+<')

这是一个愚蠢的模式,但它会匹配#deeds<,所以它就是一个例子。那么,你如何在正确的位置插入空格?

您需要做的是将其捕获为单独的

r = re.compile(r'(#[a-z]+)(<)')

现在,您可以使用对这些组的引用:

r.sub(r'\1 \2', s)

(在这种情况下,由于你的第2组是一个静态字符串,你可以稍微简化一下 - 不要将<放在一个组中,只需使用r'\1 <'。但我认为它更多这种方式可读,如果你以后扩展你正在做的事情,性能成本很小,肯定会更灵活/更健壮。)

Regular Expression Syntax上的文档展示了如何使用可选名称创建捕获组,以及如何在re.sub中引用它;向下滚动到图表'对组的引用上下文“引用”'以获取详细信息。另请参阅re.sub

答案 1 :(得分:1)

我认为你的更高层次问题有两个正确的解决方案:

  • 要么你自己完全生成HTML页面,在这种情况下你应该只使用模板引擎,如Mako(http://www.makotemplates.org/),这将为你节省大量的麻烦。
  • 或者您正在尝试更改其他人编写的HTML页面,在这种情况下,您希望使用正确的HTML解析器(例如lxml.html - http://lxml.de/lxmlhtml.html),因为只使用正则表达式解析HTML导致痛苦和痛苦。