我需要在文本文档中查找价格。我的代码如下所示:
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']
如何重写我的正则表达式只包含由空格或标点符号分隔的价格?
答案 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']