用于获取字符串部分的正则表达式

时间:2014-04-23 06:46:47

标签: python regex

我的字符串如下所示

psd_13de&pqr;gpd_DCQ1

我想从上面的字符串中获取DCQ1,我尝试了以下正则表达式,但它不起作用,我得到的结果

>>> pid="psd_13de&pqr;gpd_DCQ1"
>>> prog = re.compile('gpd_')
>>> result = prog.match(pid)
>>> print result
    None

我尝试使用re.search如下

>>> result = prog.search(pid)
>>> print result
    <_sre.SRE_Match object at 0x02349A30>
>>> print result.group()
    Pid_

我如何获得值DCQ1?

1 个答案:

答案 0 :(得分:2)

re.match将尝试匹配字符串开头的正则表达式。您需要在此使用re.search

实际上,只有当字符串以prog.match开头时,gpd_才会返回匹配。

import re
print re.search('gpd_', "psd_13de&pqr;gpd_DCQ1")
# <_sre.SRE_Match object at 0x7f679aad71d0>
print re.match ('gpd_', "psd_13de&pqr;gpd_DCQ1")
# None

要获取值DCQ1,您需要使用Look behind断言,如此

print re.search('(?<=gpd_)(.*)', "psd_13de&pqr;gpd_DCQ1").group()
# DCQ1

您可以在此处看到在线演示

Regular expression visualization

Debuggex Demo

引自Pyton的RegEx文档的lookbehind断言部分,

  

(小于?= ...)

     

匹配,如果字符串中的当前位置前面是以当前位置结束的...匹配。这被称为积极的外观断言。 (?<=abc)def将在abcdef中找到匹配项,因为lookbehind将备份3个字符并检查包含的模式是否匹配。包含的模式必须仅匹配某些固定长度的字符串,这意味着允许abca|b,但a*a{3,4}不允许。search()match()请注意,以正向lookbehind断言开头的模式在搜索字符串的开头不匹配;您很可能希望使用>>> import re >>> m = re.search('(?<=abc)def', 'abcdef') >>> m.group(0) 'def' 函数而不是>>> m = re.search('(?<=-)\w+', 'spam-egg') >>> m.group(0) 'egg' 函数

print re.search('gpd_(.*)', "psd_13de&pqr;gpd_DCQ1").group(1)
# DCQ1
     

此示例查找连字符后面的单词:

gpd_

修改:更简单,如suggested by tripleee in the comments

group(1)

搜索以{{1}}开头的字符串并捕获字符串的其余部分。然后仅使用{{1}}返回第一个捕获的字符串。