我有以下两个字符串:
s1 = 'Audio: Dolby Digital 5.1 (English)'
s2 = 'Audio: Stereo (English, French)'
我想在每个字符串中提取第一种语言。以下是我到目前为止的情况:
re.search(r'\s\((.+)', s1)
['English)']
如何改善这一点以适应上述两个方面?
答案 0 :(得分:3)
你可以使用它,它只会找到第一种语言,而且只是你现有代码的一个小调整
f=re.findall(r'\((\w+)', s1)
e=re.findall(r'\((\w+)', s2)
if f:
print f
if e:
print e
f = ['English']
e = ['English']
如果您只想要第一种语言,那么您应该使用search
来代替
f = re.search(r'\((\w+)', s1)
e = re.search(r'\((\w+)', s2)
if f:
print f.group(1)
if e:
print e.group(1)
这将打印一个字符串而不是列表,因为它只找到一件事
答案 1 :(得分:1)
扩大搜索以使用括号或逗号+空格开始短语,并以括号或逗号+空格结束:
>>> re.findall(r'\s(?:\(|, )(.+)(?:\)|, )', s2)
['English, French']
括号后的?:
表示非捕获组。
然后,您可以使用索引来获取您感兴趣的任何语言。
由于您正在搜索的字符串实际上非常整洁,您也可以在没有正则表达式的情况下执行此操作:
>>> s1.split('(')[1].split(')')[0].split(', ')[0]
'English'
>>> s2.split('(')[1].split(')')[0].split(', ')[0]
'English'
答案 2 :(得分:0)
假设语言总是在最后,用括号括起来并列在,
:
(?<=\()\w+(?=(?:, \w+)*\)$)
这个想法是:
(?<=\()
- 该字符串前面应有一个左括号((
)\w+
- 语言本身就是一系列字母(?=(?:, \w+)*\)$)
- 之后,可以有零个或多个其他语言,用逗号和空格分隔,并在关闭括号后{{1} })将我们留在字符串的末尾答案 3 :(得分:0)
答案 4 :(得分:0)
您正在寻找第一个LParen之后和第一个逗号之前的文本。因此,与此匹配的正则表达式是:
\(([^,]*),
(你的答案将在第1组) 最后,我想指出https://www.debuggex.com/,这将帮助您轻松查看正则表达式问题。