当存在可选的子字符串分隔符时,在括号内提取组

时间:2017-02-22 01:42:06

标签: python regex string unicode delimiter

给出2个字符串:

l = ['作主 (zuòzhǔ)', '座右铭 (座右銘, zuòyòumíng)']

所需的输出是:

('作主', None, 'zuòzhǔ')
('作主', '座右銘', 'zuòyòumíng')

我试图提取这些群组,但我无法将座右銘, 'zuòyòumíng分成两组:

l = ['作主 (zuòzhǔ)', '座右铭 (座右銘, zuòyòumíng)']
word = re.search(r'(.*)\s\((.*?)\)', l[0])

sim = word.group(1)
try:
    pinyin = word.group(3)
    trad = word.group(2)
except:
    pinyin = word.group(2)
    trad = None

print (sim, trad, pinyin)

我可以这样做:

try:
    pinyin = word.group(3)
    trad = word.group(2)
except:
    trad, pinyin = word.group(2).split(', ')

但可以在正则表达式中完成逗号分割吗?

我也试过这个,但它仍然捕获.*?中的整个字符串:

(.*)\s\((.*?[,][\s].*?)\)

1 个答案:

答案 0 :(得分:3)

您可以使用以下正则表达式:

(.*?) \((?:(.*?), )?(.*?)\)

唯一的区别是包含逗号前的部分的可选非捕获组:(?:(.*?), )?

In [4]: re.search(r'(.*?) \((?:(.*?), )?(.*?)\)', '座右铭 (座右銘, zuòyòumíng)').groups()
Out[4]: ('座右铭', '座右銘', 'zuòyòumíng')

In [5]: re.search(r'(.*?) \((?:(.*?), )?(.*?)\)', '作主 (zuòzhǔ)').groups()
Out[5]: ('作主', None, 'zuòzhǔ')