正则表达式不在python中工作,但在在线正则表达式工具中工作
我试图从configs中获取一个主机名,有时会在config中的主机名中添加一个-p或-s,这实际上不是主机名的一部分。 因此,我编写了这个正则表达式来从配置文件中获取主机名:正则表达式不在python中工作,但在在线正则表达式工具中工作,python,regex,Python,Regex,我试图从configs中获取一个主机名,有时会在config中的主机名中添加一个-p或-s,这实际上不是主机名的一部分。 因此,我编写了这个正则表达式来从配置文件中获取主机名: REGEX_HOSTNAME = re.compile('^hostname\s(?P<hostname>(\w|\W)+?)(-p|-P|-s|-S)?$\n',re.MULTILINE) hostname = REGEX_HOSTNAME.search(config).group('hostname')
REGEX_HOSTNAME = re.compile('^hostname\s(?P<hostname>(\w|\W)+?)(-p|-P|-s|-S)?$\n',re.MULTILINE)
hostname = REGEX_HOSTNAME.search(config).group('hostname').lower().strip()
但是在我的主机名结果列表的末尾仍然是-p
ign-hshst-hsh-01-p
ign-hshst-hsh-02-p
ign-hshst-hsd-10
ign-hshst-hsh-01-S
ign-hshst-hsd-11
ign-hshst-hsh-02-s
在Regex101在线测试仪中,它可以工作,-p是最后一组的一部分。在我的python(2.7)脚本中,它不起作用
奇怪的行为是,当我使用稍微修改过的2遍正则表达式时,它可以工作:
REGEX_HOSTNAME = re.compile(r'^hostname\s*(?P<hostname>.*?)\n?$', re.MULTILINE)
REGEXP_CLUSTERNAME = re.compile('(?P<clustername>.*?)(?:-[ps])?$')
hostname = REGEX_HOSTNAME.search(config).group('hostname').lower().strip()
clustername = REGEXP_CLUSTERNAME.match(hostname).group('clustername')
REGEX\u HOSTNAME=re.compile(r'^HOSTNAME\s*(?P.*?)\n?$,re.MULTILINE)
REGEXP_CLUSTERNAME=re.compile('(?P.*?(:-[ps])?$'))
hostname=REGEX_hostname.search(config).group('hostname').lower().strip()
clustername=REGEXP\u clustername.match(主机名).group('clustername'))
现在Hostname有了全名,clustername在末尾没有可选的'-p'。您可以使用
ign-hshst-hsh-01-p
ign-hshst-hsh-02-p
ign-hshst-hsd-10
ign-hshst-hsh-01-S
ign-hshst-hsd-11
ign-hshst-hsh-02-s
import re
config=r"""terminal width 120
hostname IGN-HSHST-HSH-01-P
domain-name sample.com"""
REGEX_HOSTNAME = re.compile(r'^hostname\s*(.*?)(?:-[ps])?$', re.MULTILINE|re.I)
hostnames =[ h.lower().strip() for h in REGEX_HOSTNAME.findall(config) ]
print(hostnames) # => ['ign-hshst-hsh-01']
看。
^hostname\s*(.*)(:-[ps])?$
正则表达式匹配:
-行的开始(由于^
,它也与换行后的位置相匹配)re.MULTILINE
-一个单词(不区分大小写,因为hostname
)re.I
-0+空格\s*
-第1组:除换行符以外的零个或多个字符,尽可能少(.*)
-可选出现(?:-[ps])?
,然后出现-
或p
(不区分大小写!)s
-行的末尾(由于$
)re.MULTILINE
import re
config=r"""terminal width 120
hostname IGN-HSHST-HSH-01-P
domain-name sample.com"""
REGEX_HOSTNAME = re.compile(r'^hostname\s*(.*?)(?:-[ps])?$', re.MULTILINE|re.I)
hostnames =[ h.lower().strip() for h in REGEX_HOSTNAME.findall(config) ]
print(hostnames) # => ['ign-hshst-hsh-01']
看。
^hostname\s*(.*)(:-[ps])?$
正则表达式匹配:
-行的开始(由于^
,它也与换行后的位置相匹配)re.MULTILINE
-一个单词(不区分大小写,因为hostname
)re.I
-0+空格\s*
-第1组:除换行符以外的零个或多个字符,尽可能少(.*)
-可选出现(?:-[ps])?
,然后出现-
或p
(不区分大小写!)s
-行的末尾(由于$
)re.MULTILINE
请参阅使用上述代码获得的。。你确定你已经共享了你的代码吗?我不确定这是否是问题的一部分,但你应该始终为regexp使用原始字符串。虽然在Python代码中定义regexp时应该使用原始字符串文字,但这不是问题所在。目前,还不清楚,因为显示的代码没有显示上述行为。是的,这正是从我的脚本复制的代码。我试了一遍又一遍。在所有在线Reges测试人员中,它都是有效的。在我在Mac上运行的脚本中没有。出于某种原因,主机名组还获取'-p'。如果您有更好的建议,我很高兴更改我的正则表达式。请尝试此代码-您可以使用上面的代码。你确定你已经共享了你的代码吗?我不确定这是否是问题的一部分,但你应该始终为regexp使用原始字符串。虽然在Python代码中定义regexp时应该使用原始字符串文字,但这不是问题所在。目前,还不清楚,因为显示的代码没有显示上述行为。是的,这正是从我的脚本复制的代码。我试了一遍又一遍。在所有在线Reges测试人员中,它都是有效的。在我在Mac上运行的脚本中没有。出于某种原因,主机名组还获取'-p'。如果您有更好的建议,我很高兴更改我的正则表达式。请尝试以下代码-