【问题标题】:How to find all matches in a regular expression如何在正则表达式中查找所有匹配项
【发布时间】:2015-10-05 07:04:52
【问题描述】:

我的表达可以只出现一次,但如果多次出现,它会捕捉整个部分。

我的正则表达式是

[=:]\s*[\"\']?(.*=_ash)[\"\']?

我尝试了regex.findallsearch 当多次出现时,我得到了整个部分。

我是否需要设置任何标志来搜索多次出现我的正则表达式本身是否存在问题。

前三行正常,但是

sample_string = 'asdfanksdfkjasdf_ash'

sample_str = "asdfasdfasdf_ash"

sample_st = assdfvb/23+sdf_ash

sample_s : 'assdfvb/23+sdf_ash'

sample = {'sample' : { 'hi' : 'asdfasdf+/asdf+_ash' , 'hello' : 'asdfasf+/asdf+v_ash' }} 

我这里只需要值部分

【问题讨论】:

  • 请在您的问题中更清楚。写下输入是什么,输出是什么,你的预期输出是什么。
  • @nhahtdh 正如我的示例清楚地表明的那样,这不仅适用于 json。
  • @Noname:让我澄清一下我的说法:如果你有办法将 JSON 与其他输入分开,你应该使用 JSON 解析器来处理它们。

标签: python regex python-2.7


【解决方案1】:

你的模式的问题是.*

默认情况下,正则表达式引擎是贪婪的,.* 尽可能多地消耗。要更改此行为,您可以使用lazy quantifier。在.*? 中添加额外的“?”可以使其尽可能少地重复。

此外,您可能希望在值未以 "_ash" 结尾的情况下使其失败,检查引用文本中的引号,或者如果未引用则检查空格:

正则表达式:

[=:]\s*(?:(["'])((?:(?!\1).)*_ash)\1|(\S*_ash)(?!\S))

regex101 Demo

  • (["']) 捕获第 1 组中的报价
  • (?:(?!\1).)* 匹配除第 1 组中捕获的引号之外的任何字符
  • \1 匹配结束引号(与开始引号相同)
  • \S* 不带引号的文本,匹配除空格以外的任何内容
  • (?!\S)检查值到此结束

如果值在引号中,则在 .group(2) 中捕获,如果未加引号,则在 .group(3) 中。

代码:

#python 2.7.10
import re

text = """sample = {'sample' : { 'hi' : 'asdfasdf+/asdf+_ash' , 'hello' : 'asdfasf+/asdf+v_ash' }}"""
n = 0

pattern = re.compile( r'[=:]\s*(?:(["\'])((?:(?!\1).)*_ash)\1|(\S*_ash))')

#loop all matches
for match in pattern.finditer(text):
    n += 1
    print '\nMatch #%s:' % n

    #Show groups 2 and 3 captures
    for i in range(2,4):
        print 'Group %s - [%s:%s]:  %s' % (i, match.start(i), match.end(i), match.group(i))

ideone Demo

【讨论】:

    【解决方案2】:

    我认为您需要将您的正则表达式更改为:

    [=:]\s*['"]?([^\s\'\"=:]*?_ash)['"]?
    

    [Regex Demo]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 2011-06-09
      相关资源
      最近更新 更多