匹配中间的字符串而不返回开始和结束

时间:2015-02-11 21:37:45

标签: python regex

我有以下字符串样式:

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

我在考虑匹配后剥离结果但是有更好的方法吗?

3 个答案:

答案 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=([^;]+)

DEMO

将匹配锚点而不包括它们。

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'}