在python中正则表达式中重复

deg*_*ath 2 python regex python-2.7

我有一个带有行的文件,例如:

aaa$bb$ccc$ddd$eee
fff$ggg$hh$iii$jj
Run Code Online (Sandbox Code Playgroud)

我需要接受$$内部的内容,因此预期的结果是:

 $bb$
 $ddd$
 $ggg$
 $iii$
Run Code Online (Sandbox Code Playgroud)

我的结果:

$bb$
$ggg$
Run Code Online (Sandbox Code Playgroud)

我的解决方案

m = re.search(r'$(.*?)$', line)
    if m is not None:
        print m.group(0)
Run Code Online (Sandbox Code Playgroud)

任何想法如何提高我的正则表达式?我尝试使用*和+符号,但我不确定如何最终创建它.我正在寻找类似的帖子,但无法找到它:(

Wik*_*żew 6

您可以使用re.findallr'\$[^$]+\$'正则表达式:

import re
line = """aaa$bb$ccc$ddd$eee
fff$ggg$hh$iii$jj"""
m = re.findall(r'\$[^$]+\$', line)
print(m)
# => ['$bb$', '$ddd$', '$ggg$', '$iii$']
Run Code Online (Sandbox Code Playgroud)

请参阅Python演示

请注意,您需要转义$s并删除捕获组re.findall以返回$...$子字符串,而不仅仅是$s 内部的内容.

图案细节:

  • \$ - 美元符号(字面)
  • [^$]+ - 除1以外的1个或更多符号 $
  • \$ - 一个字面的美元符号.

注意:这[^$]是一个否定的字符类,它匹配任何char,但是类中定义的char.使用否定字符类可加速匹配,因为.*?懒字点模式在两个$s 之间的字符串中的每个位置处扩展,因此需要更多步骤来完成并返回匹配.

并且模式的变体只能获得$...$s中的文本:

re.findall(r'\$([^$]+)\$', line) 
               ^     ^
Run Code Online (Sandbox Code Playgroud)

另一个Python演示.请注意,(...)添加的捕获组re.findall只能返回捕获的内容,而不能返回匹配的内容.