python re:r'\ b \ $ \ d + \ b'将不匹配'aug 12,2010 abc $ 123'

时间:2010-09-16 15:40:21

标签: python regex

所以我只是制作一个脚本来从事务日志类型文件中收集$值

for line in sys.stdin:
    match = re.match( r'\b \$ (\d+) \b', line)
    if match is not None:
            for value in match.groups():
                    print value

现在我只是想打印这些值 它会匹配一个包含$ 12323的行,但是当该行中还有其他内容时则不匹配 从我读到的它应该工作,但看起来我可能会遗漏一些东西

4 个答案:

答案 0 :(得分:6)

re.match

  

如果字符串开头的零个或多个字符与此正则表达式匹配,则返回相应的MatchObject实例。如果字符串与模式不匹配,则返回None;请注意,这与零长度匹配不同。

您要找的是re.searchre.findall

#!/usr/bin/env python

import re
s = 'aug 12, 2010 abc $123'

print re.findall(r'\$(\d+)', s)
# => ['123']

print re.search(r'\$(\d+)', s).group()
# => $123

print re.search(r'\$(\d+)', s).group(1)
# => 123

答案 1 :(得分:3)

通过在\$(\d+)之间留出空格,正则表达式需要在它们之间的字符串中留出空格。有这样的空间吗?

答案 2 :(得分:1)

我不太清楚接受你的是什么,但声明

  

包含$ 12323的行,但在行

中还有其他内容时则不行

我会得到那个

  

'aug 12,2010 abc $ 123'

不应该匹配,因为它有其他文本的数量。

如果你想在这一行的最后匹配金额,那么这是习惯性的反正则表达式答案(即使我不反对在简单的情况下使用它们):

loglines = ['aug 12, 2010 abc $123', " $1 ", "a $1 amount", "exactly $1 - no less"]

# match $amount at end of line without other text after
for line in loglines:
    if '$' in line:
        _,_, amount = line.rpartition('$')
        try:
            amount = float(amount)
        except:
            pass
        else:
            print "$%.2f" % amount

答案 3 :(得分:0)

其他人已经指出了你的正则表达式的一些缺点(特别是强制空格和re.matchre.search)。

还有另外一件事:\b字锚在字母数字和非字母数字字符之间匹配。换句话说,\b \$将失败(即使在进行搜索而不是匹配操作时),除非字符串在空格之前有一些字母数字字符。

与你的正则表达式合作的例子(公认的做法):

>>> import re
>>> test = [" $1 ", "a $1 amount", "exactly $1 - no less"]
>>> for string in test:
...     print(re.search(r"\b \$\d+ \b", string))
...
None
<_sre.SRE_Match object at 0x0000000001DD4370>
None