考虑以下字符串:
server
server_secure
server_APAC_secure
server_APAC
server_US
server_US_secure
server_EU_secure
server_ISRAEL
模板很简单:
server
US
,APAC
)。区域字符串可以是任何英文字母序列,但单词secure
除外。secure
,前缀为下划线我想获得出现在一组字符串中的区域列表。使用字符串操作非常简单,但我确信它可以使用正则表达式来实现。
如何从每个字符串中提取可选区域子字符串?
答案 0 :(得分:2)
只需匹配任何后跟字边界或_secure
:
region = re.compile(r'server_([A-Z]+)(?_secure|\b)')
这特别仅匹配大写字符,您可以根据需要扩展字符类([...]
)以根据需要匹配更多。
演示:
>>> import re
>>> region = re.compile(r'server_([A-Z]+)(?:_secure|\b)')
>>> example = '''\
... server
... server_secure
... server_APAC_secure
... server_APAC
... server_US
... server_US_secure
... server_EU_secure
... server_ISRAEL
... '''.splitlines()
>>> for ex in example:
... match = region.search(ex)
... if match is not None:
... print match.group(1)
...
APAC
APAC
US
US
EU
ISRAEL
答案 1 :(得分:2)
答案 2 :(得分:1)
我建议使用以下模式(为了便于阅读添加(?x)
):
pat = """(?x)
^server
(?:
_(?!secure)
([^_]+)
)?
(?:
_
(secure)
)?
"""
优点是该区域是group(1),“secure”是group(2),因此即使没有特定的子字符串,也可以使用解包:
region, secure = re.match(pat, 'server_EU_secure').groups()
print region, secure # EU secure
region, secure = re.match(pat, 'server_secure').groups()
print region, secure # None secure
region, secure = re.match(pat, 'server_ISRAEL').groups()
print region, secure # ISRAEL None