Regex Python3解析并捕获一行中的多个可选参数
我目前正在解析有关电影的文件。 以下是语言文件的示例:Regex Python3解析并捕获一行中的多个可选参数,regex,python-3.x,parsing,Regex,Python 3.x,Parsing,我目前正在解析有关电影的文件。 以下是语言文件的示例: "!Next?" (1994) Italian "#1 Single" (2006) English "#15SecondScare" (2015) English "#15SecondScare" (2015) {Because We Don't Want You to Fall Asleep (#1.3)} English
"!Next?" (1994) Italian
"#1 Single" (2006) English
"#15SecondScare" (2015) English
"#15SecondScare" (2015) {Because We Don't Want You to Fall Asleep
(#1.3)} English
"#15SecondScare" (2015) {Coming and Going (#1.11)} English
"#Adulthood" (????) English
"#Adulting" (2016/I) English
如果是一个电视节目和每一行的语言,我怎么才能知道它的名字、年份、词句和插曲?
有些争论并不总是存在的(比如它是哪一集)
这就是我所尝试的:
对于文件中的行:
打印(关于findall(“(.*”,第行))#名称
打印(关于findall(r“\D(\D{4})\D”,第行))#年
我已经有好几年的麻烦了,因为它捕捉到了第几集。
做多重模式是一种方式吗
谢谢。你可以这样做
import re
string = """
"!Next?" (1994) Italian
"#1 Single" (2006) English
"#15SecondScare" (2015) English
"#15SecondScare" (2015) {Because We Don't Want You to Fall Asleep
(#1.3)} English
"#15SecondScare" (2015) {Coming and Going (#1.11)} English
"#Adulthood" (????) English
"#Adulting" (2016/I) English
"""
rx = re.compile(r'''
^
"(?P<name>[^"]+)"
[^(]+\((?P<year>[^)]+)\)
(?:[^\{^\n]+\{(?P<subtitle>[^}]+)\})?
\s+(?P<language>[A-Z][a-z]*)
$
''', re.MULTILINE | re.VERBOSE)
movies = [(m.group('name'), m.group('year'), m.group('subtitle'), m.group('language'))
for m in rx.finditer(string)]
print(movies)
# [('!Next?', '1994', None, 'Italian'), ('#1 Single', '2006', None, 'English'), ('#15SecondScare', '2015', None, 'English'), ('#15SecondScare', '2015', "Because We Don't Want You to Fall Asleep \n (#1.3)", 'English'), ('#15SecondScare', '2015', 'Coming and Going (#1.11)', 'English'), ('#Adulthood', '????', None, 'English'), ('#Adulting', '2016/I', None, 'English')]
重新导入
string=”“”
"!下一个?”(1994)意大利语
《1首单曲》(2006)英文版
《第15秒惊吓》(2015)英文版
“#15秒惊吓”(2015){因为我们不想让你睡着
(#1.3)}英语
“#15SecondScare”(2015){来去(#1.11)}英语
“#成人期”(??)英语
“阿谀奉承”(2016/I)英语
"""
rx=重新编译(r''
^
“(?P[^”]+)”
[^(]+\(?P[^]+)\)
(?:[^\{^\n]+\{(?P[^}]+)\})?
\s+(?P[A-Z][A-Z]*)
$
'',关于多行(关于冗长)
电影=[(m.group('name')、m.group('year')、m.group('subtitle')、m.group('language'))
对于rx.finditer中的m(字符串)]
印刷品(电影)
#[(“!Next?”、“1994”、“无”、“意大利语”)、(“1单曲”、“2006”、“无”、“英语”)、(“15SecondScare”、“2015”、“无”、“英语”)、(“15SecondScare”、“2015”、“因为我们不想让你睡着”\n(#1.3)”、“英语”)、(“15SecondScare”、“2015”、“来来往往”(#1.11)、“英语”)、(“成年”、“无英语”),(‘阿谀奉承’、‘2016/I’、‘无’、‘英语’)]
请参阅的演示。
一点解释:
rx
对找到的匹配进行iter我在尝试,我认为写我写的东西是没有用的,因为我觉得我错过了一些东西…我会编辑谢谢!季节看起来是可选的,是吗?当它包含
{}
时,它一定是一个节目,括号是:{集名(#seasurenumber,eposodenumber)}
@user4725217:首先编译模式,然后迭代(finditer
)。在我看来,这使代码更具可读性。有关更多信息,请参阅@user4725217:在答案的末尾也添加了一些解释。