2016-12-05 79 views
0

我写一个Python脚本在这样的字符串找到标记名称:蟒蛇RE在模式空白

string='Tag Name =LIC100 State =TRUE'

如果使用这样的

re.search('Name(.*)State',string)

一个表达式

我得到“= LIC100”。我只想得到LIC100。

有关如何设置模式以消除空白和相等信号的任何建议?

回答

0

按照上面的提示,我设法找到一个好的解决方案 其实,我想处理的字符串有一些不可打印的字符。正是这样的

"Tag Name\x00=LIC100\x00\tState=TRUE" 

用前瞻的理念和回顾后,我发现了以下解决方案:

import re 
s = 'Tag Name\x00=LIC100\x00\tState=TRUE' 
T=re.search(r'(?<=Name\x00=)(.*)(?=\x00\tState)',s) 
print(T.group(0)) 

关于这样做的好处是,结果不会对任何非打印字符。

<_sre.SRE_Match object; span=(10, 16), match='LIC100'> 
1

这是因为你从Name到最后的State得到0+字符以外的换行符。您可能会限制在第1组的模式,只是非空格:

import re 
string='Tag Name =LIC100 State =TRUE' 
m = re.search(r'Name\s*=(\S*)',string) 
if m: 
    print(m.group(1)) 

Python demo

图案的详细资料

  • Name - 一个文字字符序列
  • \s* - 0+空格
  • = - 一个文字=
  • (\S*) - 组1捕获0+字符而不是空格(或\S+可用于匹配除空格以外的1个或多个字符)。
0

最简单的解决方案很可能只是剥离出来之后,其实像这样:

s = " =LIC100 " 
s = s.strip('= ') 
print(s) 
#LIC100 

如果你坚持在正则表达式中这样做,你可以尝试这样的:

reg = r'Name[ =]+([A-Za-z0-9]+)\s+State' 
0

您当前的正则表达式失败,因为(.*)捕获所有字符,直到出现State。您可以使用积极的倒车后台来描述优先于,但未包含在您实际想要捕获的内容中,而不是捕获所有内容。在这种情况下,“NAME =” preceeds比赛,所以我们可以把它贴在向后断言为(?<=Name =),然后进行捕捉一切,直到下一个空白:

>>> 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 
+0

谢谢skrrgwasme。这对我很有帮助。 – Dariva

+0

我意识到我正在处理的字符串有一些不可打印的字符。该字符串类似于'Tag Name \ x00 = LIC100 \ x00 \ tState = TRUE'。我尝试使用“T = re.search(r'(?<= Name \ x00 =)\ x00 *',s)”,但它返回<_sre.SRE_Match对象; span =(10,10),match =''> – Dariva