所以我只是制作一个脚本来从事务日志类型文件中收集$值
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的行,但是当该行中还有其他内容时则不匹配 从我读到的它应该工作,但看起来我可能会遗漏一些东西
答案 0 :(得分:6)
如果字符串开头的零个或多个字符与此正则表达式匹配,则返回相应的MatchObject实例。如果字符串与模式不匹配,则返回None;请注意,这与零长度匹配不同。
您要找的是re.search
或re.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.match
与re.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