python RE模式中的空白区域

时间:2016-12-05 18:13:03

标签: python regex

我正在编写一个Python脚本来查找字符串中的标记名称,如下所示:

string='Tag Name =LIC100 State =TRUE'

如果使用像这样的表达式

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

我得到" = LIC100&#34 ;.我想得到LIC100。

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

4 个答案:

答案 0 :(得分: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+ whitespaces
  • = - 文字=
  • (\S*) - 第1组捕获除空格以外的0 +字符(或\S+可用于匹配除空白之外的1个或多个字符。)

答案 1 :(得分:0)

最简单的解决方案可能就是在事后将其剥离出来,就像这样:

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

如果您坚持在正则表达式中执行此操作,可以尝试以下操作:

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

答案 2 :(得分:0)

您当前的正则表达式失败,因为(.*)会捕获所有字符,直到State出现。您可以使用正面的背后隐藏来描述之前,但不包括在您实际想要捕获的内容中,而不是捕获所有内容。在这种情况下,“Name =”在匹配之前,因此我们可以将它作为(?<=Name =)添加到lookbehind断言中,然后继续捕获所有内容直到下一个空格:

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

答案 3 :(得分:0)

按照上面的提示,我找到了一个很好的解决方案。 实际上,我试图处理的字符串有一些不可打印的字符。就像这样

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

使用lookahead和lookbehind的概念,我找到了以下解决方案:

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