Python重新捕获每个单词的一个匹配项

时间:2012-09-25 02:12:03

标签: python regex

我需要在文本文档中查找价格。我的代码如下所示:

sentence = "This is test text $25,000 $25,000$20,000 $30"
pattern = re.compile(ur'[$€£]?\d+([.,]\d+)?', re.UNICODE | re.MULTILINE | re.DOTALL)
print pattern.findall(sentence)

期望的结果是:

['$25,000', '$30']

我不需要在结果中包含$ 25,000 $ 20,000,因为这对我的任务来说不是有效的结果。我只需要完整的单词匹配。

但我得到了这个结果:

['$25,000', '$25,000', '$20,000', '$30']

如何重写我的正则表达式只包含由空格或标点符号分隔的价格?

2 个答案:

答案 0 :(得分:1)

这是我能得到的尽可能接近(虽然有很多人拥有比我更多的正则表达技能):

pattern = re.compile(ur'(?:^|\s)[$€£]?\d+(?:[.,]\d+)?(?=\s|$)', re.UNICODE | re.MULTILINE | re.DOTALL)
print pattern.findall(sentence) # [' $25,000', ' $30']

答案 1 :(得分:1)

尝试以下方法:

ur'(?<!\S)[€£$]?\d+(?:[.,]\d+)?(?!\S)'

我添加了否定断言(?<!\S)(?!\S),这意味着&#34;如果前面有非空格&#34;则无法匹配并且&#34;如果后跟非空格&#34;则不匹配分别

测试:

>>> sentence = "$1234 $56$78.90 This is test text $25,000 $25,000$20,000 $30"
>>> pattern = re.compile(ur'(?<!\S)[€£$]?\d+(?:[.,]\d+)?(?!\S)', re.UNICODE | re.MULTILINE | re.DOTALL)
>>> print pattern.findall(sentence)
['$1234', '$25,000', '$30']

如果您想在匹配之前或之后允许某些非空格字符,请将\S替换为[^\s<chars>],其中<chars>是您要允许的字符。例如:

ur'(?<![^\s:])[€£$]?\d+(?:[.,]\d+)?(?![^\s,.])'

允许模式前面有:,然后是,.

>>> sentence = "$1234 $56$78.90 This is test text:$25,000. $45. $25,000$20,000 $30"
>>> print pattern.findall(sentence)
['$1234', '$25,000', '$45', '$30']