我的字符串如下所示
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?
答案 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
您可以在此处看到在线演示
引自Pyton的RegEx文档的lookbehind断言部分,
(小于?= ...)
匹配,如果字符串中的当前位置前面是以当前位置结束的
...
匹配。这被称为积极的外观断言。(?<=abc)def
将在abcdef中找到匹配项,因为lookbehind将备份3个字符并检查包含的模式是否匹配。包含的模式必须仅匹配某些固定长度的字符串,这意味着允许abc
或a|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}}返回第一个捕获的字符串。