如何通过正则表达式提取语言

时间:2015-08-21 18:35:19

标签: python regex

我有以下两个字符串:

s1 = 'Audio: Dolby Digital 5.1 (English)'
s2 = 'Audio: Stereo (English, French)'

我想在每个字符串中提取第一种语言。以下是我到目前为止的情况:

re.search(r'\s\((.+)', s1)
['English)']

如何改善这一点以适应上述两个方面?

5 个答案:

答案 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+)*\)$)

See it in action

这个想法是:

  1. (?<=\() - 该字符串前面应有一个左括号((
  2. \w+ - 语言本身就是一系列字母
  3. (?=(?:, \w+)*\)$) - 之后,可以有零个或多个其他语言,用逗号空格分隔,并在关闭括号后{{1} })将我们留在字符串的末尾

答案 3 :(得分:0)

您可以使用正则表达式的这个简单修改:

\s\(([^,\n\)]+)

Regex101

答案 4 :(得分:0)

您正在寻找第一个LParen之后和第一个逗号之前的文本。因此,与此匹配的正则表达式是:

\(([^,]*),

(你的答案将在第1组) 最后,我想指出https://www.debuggex.com/,这将帮助您轻松查看正则表达式问题。