当有可选的子字符串定界符时,提取括号内的组
Extract groups within parenthesis when there is an optional substring delimiter
给定 2 个字符串:
l = ['作主 (zuòzhǔ)', '座右铭 (座右銘, zuòyòumíng)']
期望的输出是:
('作主', None, 'zuòzhǔ')
('作主', '座右銘', 'zuòyòumíng')
我试过这样提取组,但我无法将 座右銘, 'zuòyòumíng
分成 2 组:
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].*?)\)
您可以使用以下正则表达式:
(.*?) \((?:(.*?), )?(.*?)\)
唯一的区别是可选的非捕获组包含逗号前的部分:(?:(.*?), )?
.
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ǔ')
给定 2 个字符串:
l = ['作主 (zuòzhǔ)', '座右铭 (座右銘, zuòyòumíng)']
期望的输出是:
('作主', None, 'zuòzhǔ')
('作主', '座右銘', 'zuòyòumíng')
我试过这样提取组,但我无法将 座右銘, 'zuòyòumíng
分成 2 组:
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].*?)\)
您可以使用以下正则表达式:
(.*?) \((?:(.*?), )?(.*?)\)
唯一的区别是可选的非捕获组包含逗号前的部分:(?:(.*?), )?
.
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ǔ')