在Python中将字符串与数字0-9匹配

3

这是我正在将其转换为Python的Bash代码:

if [[ "$hostname_from_route53" =~ $host[0-9].$env.$domain ]];

我希望能够比较"$hostname_from_route53"$host[0-9].$env.$domain

这可能是:

server1.prod.aws.<company>.co.uk =~ $server[0-9].prod.aws.<company>.co.uk
server9.dev.aws.<company>.co.uk =~ $server[0-9].dev.aws.<company>.co.uk

我在努力将这个转换成Python代码。我感觉它应该包括import re和某种类型的re.compile,但似乎找不到类似于上面bash示例的等价代码。


2
请尝试不使用Bash代码来提出您的问题。 - Sнаđошƒаӽ
你需要编写正则表达式来匹配这个字符串。 - Rahul K P
@Sнаđошƒаӽ 谢谢您。我会尽力改进下一次。 - Rahul K P
3个回答

4

这样的东西应该能帮助你入门

import re

hostname_from_route53 = "server1.prod.aws.<company>.co.uk"

host = "server"
env = "prod"
domain = "aws"

pattern = r'^{host}[0-9]\.{env}\.{domain}'

filled_pattern = pattern.format(host=re.escape(host),
                                env=re.escape(env),
                                domain=re.escape(domain))

regex = re.compile(filled_pattern)

if regex.match(hostname_from_route53):
    do_stuff()

注意,像 server12.dev.aws.<company>.co.uk 这样的主机名将不匹配上述内容。为了匹配上面的数字大于 9,您应将 pattern 更改为以下内容:
pattern = r'^{host}[0-9]+\.{env}\.{domain}'

1
re.compile 中变量的使用非常好!我之前不知道这是可能的。 - fedorqui
1
你可能想先对变量应用 re.escape() 函数来转义其中嵌入的元字符。 - Martijn Pieters

1

在等待这里的回复时,我想我解决了它:

if re.search(r"%s[0-9].%s.%s" % (host, env, domain), 
               hostname_from_route53, re.IGNORECASE):

1
没有什么需要辩解的。你提出了一个清晰的问题(虽然你至少可以展示一些Python代码,或者你的尝试),然后在等待回复时提出了一个解决方案。我喜欢这个答案,也喜欢Jivan的答案。 - fedorqui
2
你可能想要转义点号(仅匹配字面上的“。”而不是任何字符),并且还应该转义hostenvdomain值,以防它们包含正则表达式元字符:r"%s[0-9]\.%s\.%s" % map(re.escape, (host, env, domain)) - Martijn Pieters

1
我会使用类似这样的正则表达式:
re.escape(host) + r"[0-9]\." + re.escape(env) + r"\." + re.escape(domain)

例如,你可以这样说:

import re

host="myhost"
env="dd"
domain="aa"
my_regex = re.escape(host) + r"[0-9]\." + re.escape(env) + r"\." + re.escape(domain)
for var in ["myhost2.dd.aa", "myhost99.dd.aa"]:
    if re.search(my_regex, var):
        print(var, "matched!")
    else:
        print(var, "did not match")

执行它会返回:

$ python my_match.py 
('myhost2.dd.aa', 'matched!')
('myhost99.dd.aa', 'did not match')

我认为有更简洁的方法来完成这个任务。例如,Jivan使用.format()的方式使得它更容易实现。我也想知道是否可以一起使用re.escape()而不是为每个变量调用它。 - fedorqui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接