Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式不在python中工作,但在在线正则表达式工具中工作_Python_Regex - Fatal编程技术网

正则表达式不在python中工作,但在在线正则表达式工具中工作

正则表达式不在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')

我试图从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').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
  • \s*
    -0+空格
  • (.*)
    -第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
  • \s*
    -0+空格
  • (.*)
    -第1组:除换行符以外的零个或多个字符,尽可能少
  • (?:-[ps])?
    -可选出现
    -
    ,然后出现
    p
    s
    (不区分大小写!)
  • $
    -行的末尾(由于
    re.MULTILINE

请参阅使用上述代码获得的。

。你确定你已经共享了你的代码吗?我不确定这是否是问题的一部分,但你应该始终为regexp使用原始字符串。虽然在Python代码中定义regexp时应该使用原始字符串文字,但这不是问题所在。目前,还不清楚,因为显示的代码没有显示上述行为。是的,这正是从我的脚本复制的代码。我试了一遍又一遍。在所有在线Reges测试人员中,它都是有效的。在我在Mac上运行的脚本中没有。出于某种原因,主机名组还获取'-p'。如果您有更好的建议,我很高兴更改我的正则表达式。请尝试此代码-您可以使用上面的代码。你确定你已经共享了你的代码吗?我不确定这是否是问题的一部分,但你应该始终为regexp使用原始字符串。虽然在Python代码中定义regexp时应该使用原始字符串文字,但这不是问题所在。目前,还不清楚,因为显示的代码没有显示上述行为。是的,这正是从我的脚本复制的代码。我试了一遍又一遍。在所有在线Reges测试人员中,它都是有效的。在我在Mac上运行的脚本中没有。出于某种原因,主机名组还获取'-p'。如果您有更好的建议,我很高兴更改我的正则表达式。请尝试以下代码-