正则表达式提取括号

时间:2015-05-12 20:09:41

标签: python regex

a = "[abc]def - aaa"      # key = "abc" value = "def - aaa"
a2 = "[_abc def]def - aaa"  # key = "_abc def" value = "def - aaa"
b = "[abc]"
c = "abc]"                 # key = "abc"   value = ""
d = "[abc]]def/acd"       # key = "abc"   value = "def/acd"
f = "abc]]"               # key = "abc" value = ""

以上只是模式的一些例子。我有成千上万个类似的字符串变量。支架可以是单"]", "["或双"]]", "[[",也可以是左侧缺失。

我想要的是获得键值对。键是括号内的字符串(左括号可能丢失)(例如,abcabc def)。该值是括号右侧的字符串,例如def - aaadef/acd或空字符串。

如何在Python中定义正则表达式模式?我尝试了一些,但它们并不适用于所有变量。

我尝试了re.search(r"([^[].*?)(?:]|]])([^]].*)", a),但它不适用于re.search(r"([^[].*?)(?:]|]])([^]].*)", b)

3 个答案:

答案 0 :(得分:2)

如果您只想忽略括号,则可以使用:

words = re.split('[\[\]]+', key_value)
words = filter(None, words)          # remove empty words
key = words[0]
value = words[1] if len(words) > 1 else None

此模式已从文档中复制:re — Regular expression operations

答案 1 :(得分:2)

Peronally我会用.index()来做,但是你要求一个regexp,所以在这里。

>>> expr = r"^(?:\[?)(.*?)\]+(.*?)$"
>>> re.search(expr, a).group(0, 1, 2)
('[abc]def - aaa', 'abc', 'def - aaa')
>>> re.search(expr, a2).group(0, 1, 2)        
('[_abc def]def - aaa', '_abc def', 'def - aaa')
>>> re.search(expr, b).group(0, 1, 2)
('[abc]', 'abc', '')
>>> re.search(expr, c).group(0, 1, 2)
('abc]', 'abc', '')
>>> re.search(expr, d).group(0, 1, 2)
('[abc]]def/acd', 'abc', 'def/acd')
>>> re.search(expr, f).group(0, 1, 2)         
('abc]]', 'abc', '')

请参阅右侧栏here上的“匹配信息”部分。

答案 2 :(得分:1)

我会在这里使用rpartition:

txt='''\
[abc]def - aaa
[_abc def]def - aaa
[abc]
abc]
[abc]]def/acd
abc]]'''

import re

for e in txt.splitlines():
    li=e.rpartition(']')
    key=re.search(r'([^\[\]]+)', li[0]).group(1)
    value=li[-1]
    print '{:20}=> "{}":"{}"'.format(e,key, value)

如果想要使用正则表达式,您可以使用:

for e in txt.splitlines():
    m=re.search(r'\[*([^\[\]]+)\]*(.*)', e)
    print '{:20}=> "{}":"{}"'.format(e,*m.groups())

在任何一种情况下,都会打印:

[abc]def - aaa      => "abc":"def - aaa"
[_abc def]def - aaa => "_abc def":"def - aaa"
[abc]               => "abc":""
abc]                => "abc":""
[abc]]def/acd       => "abc":"def/acd"
abc]]               => "abc":""