Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python正则表达式中的重复_Python_Regex_Python 2.7 - Fatal编程技术网

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$