0

考虑以下字符串:

server
server_secure
server_APAC_secure
server_APAC
server_US
server_US_secure
server_EU_secure
server_ISRAEL

模板很简单:

  1. 字符串server
  2. 以下划线为前缀的可选区域字符串(例如US, )。APAC区域字符串可以是任何英文字母序列,单词除外secure
  3. 一个可选的secure,前缀为下划线

我想获取出现在一组字符串中的区域列表。使用字符串操作非常简单,但我很确定可以使用正则表达式来实现。

如何从每个字符串中提取可选区域子字符串?

4

3 回答 3

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
于 2013-05-13T11:33:09.983 回答
2

server_((?!secure)[a-zA-Z]+)

第一个捕获将具有所需的名称。

演示:http ://regexr.com?34rlv

于 2013-05-13T11:35:52.520 回答
1

我建议使用以下模式((?x)为便于阅读而添加):

pat = """(?x)
    ^server
    (?:
        _(?!secure)
        ([^_]+)
    )?
    (?:
        _
        (secure)
    )?
"""

优点是区域是组(1),“安全”是组(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
于 2013-05-13T11:44:10.433 回答