我正在解析一些由不同人转录的电视剧集,这意味着我需要搜索各种格式。例如,新场景以以下两种方式之一表示:
[A coffee shop]
或者
INT. Coffee shop - NIGHT
现在,我将它与 Python 中的以下正则表达式匹配:
re.findall("(^\[(.+?)\]$)|(^[INTEXT]{3}\. .+?$)", text)
其中“文本”是整个脚本的文本(因此使用findall
)。这总是出现在自己的行上,因此^$
这给了我类似的东西:(None, None, "INT. Coffee Shop - NIGHT")
例如。
我的问题:你如何构造一个正则表达式来搜索两个复杂模式之一,使用|
符号,而不创建你真的不想要的子匹配?或者,还有更好的方法?
非常感谢。
更新:我忽略了非捕获组的想法。我可以通过以下方式完成我想要的:
"(?:^\[.+?\]$)|(?:^[INTEX]{3}\. .+?$)"
然而,这提出了一个新问题。我实际上并不想要场景中的括号或 INT/EXT,只是位置。我认为我可以在非捕获组中使用实际组,但我仍然得到其他表达式的空白匹配,如下所示:
import re
pattern = "(?:^\[(.+?)\]$)|(?:^[INTEX]{3}\. (.+?)$)"
examples = [
"[coffee shop]",
"INT. COFFEE SHOP - DAY",
"EXT. FIELD - NIGHT",
"[Hugh's aparment]"
]
for example in examples:
print re.findall(pattern, example)
'''
[('coffee shop', '')]
[('', 'COFFEE SHOP - DAY')]
[('', 'FIELD - NIGHT')]
[("Hugh's aparment", '')]
'''
我可以只join()
使用它们,但有更好的方法吗?