python正则表达式中的重复
我有一个包含行的文件,例如:python正则表达式中的重复,python,regex,python-2.7,Python,Regex,Python 2.7,我有一个包含行的文件,例如: aaa$bb$ccc$ddd$eee fff$ggg$hh$iii$jj 我需要获取$$中的内容,因此预期结果为: $bb$ $ddd$ $ggg$ $iii$ 我的结果是: $bb$ $ggg$ 我的解决方案: m = re.search(r'$(.*?)$', line) if m is not None: print m.group(0) 如何改进我的regexp?我试着使用*和+符号,但我不确定最终如何创建它。 我正在
aaa$bb$ccc$ddd$eee
fff$ggg$hh$iii$jj
我需要获取$$中的内容,因此预期结果为:
$bb$
$ddd$
$ggg$
$iii$
我的结果是:
$bb$
$ggg$
我的解决方案:
m = re.search(r'$(.*?)$', line)
if m is not None:
print m.group(0)
如何改进我的regexp?我试着使用*和+符号,但我不确定最终如何创建它。
我正在搜索类似的帖子,但找不到:(您可以使用r'\$[^$]+\$”
regex:
import re
line = """aaa$bb$ccc$ddd$eee
fff$ggg$hh$iii$jj"""
m = re.findall(r'\$[^$]+\$', line)
print(m)
# => ['$bb$', '$ddd$', '$ggg$', '$iii$']
看
请注意,您需要转义$
s并删除re.findall
的捕获组,以返回$…$
子字符串,而不仅仅是$
s中的内容
图案细节:
-美元符号(文字)\$
-1个或多个符号,而不是[^$]+
$
-一个字面上的美元符号\$
[^$]
是一个否定字符类,它匹配除一个字符以外的任何字符在类中定义。此处使用否定字符类可加快匹配速度,因为*?
惰性点模式在两个$
之间的字符串中的每个位置展开,因此需要更多步骤来完成和返回匹配
以及模式的一种变体,以仅获取$…$
s中的文本:
re.findall(r'\$([^$]+)\$', line)
^ ^
请参见。注意
(…)
添加了捕获组,以便re.findall
只能返回捕获的内容,而不能返回匹配的内容。re.search
只查找第一个匹配项。也许您需要返回字符串列表的re.findall
,或者返回匹配对象迭代器的re.finditer
。此外,您必须使用cape$
至\$
,因为未经scaped$
表示“行尾”
例如:
>>> re.findall(r'\$.*?\$', 'aaa$bb$ccc$ddd$eee')
['$bb$', '$ddd$']
>>> re.findall(r'\$(.*?)\$', 'aaa$bb$ccc$ddd$eee')
['bb', 'ddd']
另一个改进是使用
[^$]*
而不是*?
;前者是指“除$
之外,任何字符都不能超过零;这可能会避免更病态的回溯行为。您的正则表达式很好。只查找行中的第一个匹配项。您正在查找,它会查找所有不重叠的匹配项。最后一位对您很重要,因为您有相同的起始和结束分隔符。”
for m in m = re.findall(r'$(.*?)$', line):
if m is not None:
print m.group(0)
从技术上讲,
ccc
和hh
也在$
里面。你也想要吗?用.findall
代替。搜索
好问题,不,我不想要ccc和hh,我想知道我的评论到哪里去了。我认为这个问题不是完全重复的,因为仅仅是re.findall
与c的用法当前表达式不会产生预期的行为。实际上,当我使用findall时,预期的结果是bb,ddd,ggg,iii,而不是$bb$,$ddd$,$ggg$,$iii$