【问题标题】:repetition in regular expression in pythonpython中正则表达式的重复
【发布时间】:2016-12-29 12:51:10
【问题描述】:

我有一个文件,例如:

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)

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

【问题讨论】:

  • 技术上ccchh 也在$ 的内部。你也想要这些吗?
  • 使用.findall 而不是.search
  • 好问题,不,我不想要 ccc 和 hh
  • 我想知道我的评论去了哪里。我认为这个问题与stackoverflow.com/questions/19918169/… 不完全相同,因为仅在当前表达式中使用re.findall 不会导致预期的行为。

标签: python regex python-2.7


【解决方案1】:

您可以将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$']

Python demo

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

模式详情

  • \$ - 美元符号(文字)
  • [^$]+ - $ 以外的 1 个或多个符号
  • \$ - 文字美元符号。

注意[^$] 是一个否定字符类,它匹配除类中定义的字符之外的任何字符。在此处使用否定字符类可以加快匹配速度,因为 .*? 惰性点模式会在字符串中两个 $s 之间的每个位置展开,因此需要更多步骤来完成并返回匹配项。

还有一种模式的变体,只获取$...$s 中的文本:

re.findall(r'\$([^$]+)\$', line) 
               ^     ^

another Python demo。请注意添加了(...) 捕获组,以便re.findall 只能返回捕获的,而不是匹配的

【讨论】:

    【解决方案2】:

    你的正则表达式很好。 re.search 只找到一行中的第一个匹配项。您正在寻找re.findall,它会找到所有不重叠的匹配项。最后一点对你很重要,因为你有相同的开始和结束分隔符。

    for m in m = re.findall(r'$(.*?)$', line):
        if m is not None:
            print m.group(0)
    

    【讨论】:

      【解决方案3】:

      re.search 只找到第一个匹配项。也许你想要re.findall,它返回字符串列表,或者re.finditer,它返回匹配对象的迭代器。此外,您必须将$ 转义为\$,因为未转义的$ 表示“行尾”。


      例子:

      >>> re.findall(r'\$.*?\$', 'aaa$bb$ccc$ddd$eee')
      ['$bb$', '$ddd$']
      >>> re.findall(r'\$(.*?)\$', 'aaa$bb$ccc$ddd$eee')
      ['bb', 'ddd']
      

      另一个改进是使用[^$]* 代替.*?;前者的意思是“除$ 之外的零个或多个字符;这可以潜在地避免更多的病态回溯行为。

      【讨论】:

      • 实际上当我使用 findall 时,预期结果是 bb, ddd, ggg, iii 而不是 $bb$, $ddd$, $ggg$, $iii$
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-15
      • 2016-04-22
      • 2016-11-16
      • 1970-01-01
      • 2013-05-19
      • 2012-07-13
      相关资源
      最近更新 更多