我的表达式可以用于一次出现,但是如果给出了多次出现,它就会捕获整个部分。
我的正则表达式是
[=:]\s*[\"\']?(.*=_ash)[\"\']?
我尝试了regex.findall
和search
当有多个出现时,我得到整个部分。
我是否需要设置任何标志来搜索多次出现我的正则表达式本身是否存在问题。
前三行正在运行,但
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' }}
我只需要这里的值部分
答案 0 :(得分:1)
您的模式问题是.*
。
默认情况下,正则表达式引擎是贪婪的,.*
消耗尽可能多。要更改此行为,您可以使用lazy quantifier。添加额外" ?"在.*?
中,它会尽可能少地重复。
此外,您可能希望在价值未在"_ash"
中结束,检查引用文字中的引号或空格(如果未引用)时使其失败:< / p>
<强>正则表达式:强>
[=:]\s*(?:(["'])((?:(?!\1).)*_ash)\1|(\S*_ash)(?!\S))
(["'])
捕获第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))
答案 1 :(得分:0)