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

Python 如何通过正则表达式提取语言,python,regex,Python,Regex,我有以下两个字符串: s1 = 'Audio: Dolby Digital 5.1 (English)' s2 = 'Audio: Stereo (English, French)' 我想找出每个字符串中的第一种语言。以下是我到目前为止的情况: re.search(r'\s\((.+)', s1) ['English)'] 我该如何改进这一点来处理上述两个问题?假设语言总是放在末尾,用括号括起来,并用,列出: (?<=\()\w+(?=(?:, \w+)*\)$) (?假设语言总是在

我有以下两个字符串:

s1 = 'Audio: Dolby Digital 5.1 (English)'
s2 = 'Audio: Stereo (English, French)'
我想找出每个字符串中的第一种语言。以下是我到目前为止的情况:

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

我该如何改进这一点来处理上述两个问题?

假设语言总是放在末尾,用括号括起来,并用
列出:

(?<=\()\w+(?=(?:, \w+)*\)$)

(?假设语言总是在末尾,用括号括起来,并用
列出:

(?<=\()\w+(?=(?:, \w+)*\)$)

(?您可以使用正则表达式的以下简单修改:

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

您只需对正则表达式进行以下简单修改即可:

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

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

\(([^,]*),
(您的答案将在第1组中)
最后,我想向您指出,这将帮助您轻松地可视化您的正则表达式问题。

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

\(([^,]*),
(您的答案将在第1组中)
最后,我想向您指出,这将帮助您轻松可视化您的正则表达式问题。

扩大搜索范围,以括号或逗号+空格开头短语,以括号或逗号+空格结尾:

>>> re.findall(r'\s(?:\(|, )(.+)(?:\)|, )', s2)
['English, French']
括号后的
?:
表示非捕获组

然后,您可以通过索引获取您感兴趣的任何语言

由于您正在搜索的字符串实际上相当整洁,因此您也可以在不使用正则表达式的情况下执行此操作:

>>> s1.split('(')[1].split(')')[0].split(', ')[0]
'English'
>>> s2.split('(')[1].split(')')[0].split(', ')[0]
'English'

扩大搜索范围,以括号或逗号+空格开头短语,以括号或逗号+空格结尾:

>>> re.findall(r'\s(?:\(|, )(.+)(?:\)|, )', s2)
['English, French']
括号后的
?:
表示非捕获组

然后,您可以通过索引获取您感兴趣的任何语言

由于您正在搜索的字符串实际上相当整洁,因此您也可以在不使用正则表达式的情况下执行此操作:

>>> s1.split('(')[1].split(')')[0].split(', ')[0]
'English'
>>> s2.split('(')[1].split(')')[0].split(', ')[0]
'English'

您可以使用它,它只会找到第一种语言,这只是对现有代码的一个小调整

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)

这将打印一个字符串而不是一个列表,因为它只找到一件事

您可以使用它,它只会找到第一种语言,并且它只是对现有代码的一个小调整

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)

这将打印一个字符串而不是一个列表,因为它只找到了一件事

我想OP只是在寻找第一种语言是的,我在发布后注意到了这一点。然后我添加了关于使用索引获取第一种语言的注释(例如,
结果[0]
)。如果OP需要其他语言,可能会很有用。实际上,如果他只需要第一个结果,我不确定他为什么使用
findall()
而不是
search()
。可能是个错误。OP显然与regex有一些问题,因此他/她可能不知道差异。我认为OP只是在寻找第一种语言。是的,我在发布后注意到了这一点。然后我添加了关于使用索引获取第一种语言的注释(例如,
结果[0]
)。如果OP需要其他语言,可能会很有用。实际上,如果他只需要第一个结果,我不确定他为什么使用
findall()
而不是
search()
。可能是错误。OP显然与regex有一些问题,因此他/她可能不知道difference@David542如果这对你有效,那么别忘了标记它,这样其他人就会知道什么对你有效future@David542如果这对你有效,那么别忘了标记它,这样其他人就会知道在未来什么对你有效。我可以问一下你为什么这么做吗如果你只想要第一个结果,你就用
findall()
而不是
search()
了吗?@TigerhawkT3好点,应该修改一下。请问你为什么要用
findall()
而不是
search()
而只想要第一个结果?@TigerhawkT3好点,应该修改一下。