如何在正则表达式中查找所有匹配项

时间:2015-10-05 07:04:53

标签: python regex python-2.7

我的表达式可以用于一次出现,但是如果给出了多次出现,它就会捕获整个部分。

我的正则表达式是

[=:]\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' }} 

我只需要这里的值部分

2 个答案:

答案 0 :(得分:1)

您的模式问题是.*

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

此外,您可能希望在价值未在"_ash"中结束,检查引用文字中的引号或空格(如果未引用)时使其失败:< / p>

<强>正则表达式:

[=:]\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

答案 1 :(得分:0)

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

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

[Regex Demo]