我正在编写一个python脚本以在这样的字符串中找到标签名称:
string='Tag Name =LIC100 State =TRUE'
如果A使用这样的表达式
re.search('Name(.*)State',string)
我得到" = lic100"。我只想得到lic100。
关于如何设置模式以消除空格和相等信号的任何建议?
这是因为您从Name
到最后一个State
获得了0 字符。您可以将第1组中的模式限制为非惠特空间:
import re
string='Tag Name =LIC100 State =TRUE'
m = re.search(r'Names*=(S*)',string)
if m:
print(m.group(1))
请参阅Python Demo
模式详细信息:
-
Name
-字面的char序列 -
s*
-0 Whitespaces -
=
-字面的=
-
(S*)
-第1组捕获除whitespace以外的0 字符(或S+
可用于匹配1个或更多的字符)。
最简单的解决方案可能只是在事实之后将其剥离,就像:
:s = " =LIC100 "
s = s.strip('= ')
print(s)
#LIC100
如果您坚持在正则表达式中进行操作,则可以尝试以下操作:
reg = r'Name[ =]+([A-Za-z0-9]+)s+State'
您的当前正则态度失败,因为(.*)
捕获了所有字符,直到State
的出现为止。您可以不用捕获所有内容,而可以使用正面的lookBehind 来描述 preceeds 的内容,但不包含在您实际想要捕获的内容中。在这种情况下," name ="先于匹配,因此我们可以将其粘贴在(?<=Name =)
中,然后继续捕获所有内容,直到下一个whitespace:
>>> import re
>>> s = 'Tag Name =LIC100 State =TRUE'
>>> r = re.compile("(?<=Name =)w*")
>>> print(r.search(s))
<_sre.SRE_Match object; span=(10, 16), match='LIC100'>
>>> print(r.search(s).group(0))
LIC100
遵循上面的提示,我设法找到了一个不错的解决方案。实际上,我要处理的字符串具有一些不可打印的字符。就像这个
"Tag Namex00=LIC100x00tState=TRUE"
使用LookAhead和BookBehind的概念,我找到了以下解决方案:
import re
s = 'Tag Namex00=LIC100x00tState=TRUE'
T=re.search(r'(?<=Namex00=)(.*)(?=x00tState)',s)
print(T.group(0))
这很棒的是,结果上没有任何不可打印的字符。
<_sre.SRE_Match object; span=(10, 16), match='LIC100'>