除了特定单词之外的下划线文本

时间:2013-05-13 11:25:40

标签: python regex regex-negation

考虑以下字符串:

server
server_secure
server_APAC_secure
server_APAC
server_US
server_US_secure
server_EU_secure
server_ISRAEL

模板很简单:

  1. 字符串server
  2. 前缀为下划线的可选区域字符串(例如USAPAC)。区域字符串可以是任何英文字母序列,但单词secure除外。
  3. 可选secure,前缀为下划线
  4. 我想获得出现在一组字符串中的区域列表。使用字符串操作非常简单,但我确信它可以使用正则表达式来实现。

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

3 个答案:

答案 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)

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

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

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

答案 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