我有以下字符串样式:
line = '242322342343-gewe|gu_w=23423526,29845903458,3244;tu_w=2234234;'
我希望匹配gu_w=
和;
之间的元素,但匹配后我不希望gu_w
和;
出现在结果中:
re.compile(r'gu_w=(.*?);', re.I | re.U)
上面的表达式将返回:
gu_w=23423526,29845903458,3244;
但如何让regex返回23423526,29845903458,3244
我在考虑匹配后剥离结果但是有更好的方法吗?
答案 0 :(得分:3)
你必须做.group(0)
,这会返回整场比赛。您应该访问捕获组1
。这将仅返回(.*?)
匹配的文字:
>>> import re
>>> line = '242322342343-gewe|gu_w=23423526,29845903458,3244;tu_w=2234234;'
>>> pat = re.compile(r'gu_w=(.*?);', re.I | re.U)
>>> pat.search(line).group(1)
'23423526,29845903458,3244'
>>>
以下摘自documentation:
match.group([group1, ...])
返回匹配的一个或多个子组... 如果a
groupN
参数为零,相应的返回值为整数 匹配字符串;如果它在包含范围[1..99]
中,则它是与相应的带括号的组匹配的字符串。
答案 1 :(得分:1)
除了iCodez的答案,您还可以使用外观来处理边界。
re.compile(r"""
(?<=gu_w=) # assert literal gu_w=
.*? # match anything, non-greedily
(?=;) # assert literal ;""", re.I | re.U | re.X)
答案 2 :(得分:0)
这个正则表达式:
gu_w=([^;]+)
将匹配锚点而不包括它们。
Python演示:
>>> st='242322342343-gewe|gu_w=23423526,29845903458,3244;tu_w=2234234;'
>>> re.search(r'gu_w=([^;]+)', st).group(1)
'23423526,29845903458,3244'
您还可以使用命名捕获组来使您的意图更加清晰:
>>> seeking='gu_w'
>>> m=re.search(r'{0}=(?P<{0}>[^;]+)'.format(seeking), st)
>>> m.group(seeking)
'23423526,29845903458,3244'
或者,
>>> m.groupdict()
{'gu_w': '23423526,29845903458,3244'}