Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Python3解析并捕获一行中的多个可选参数_Regex_Python 3.x_Parsing - Fatal编程技术网

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:在答案的末尾也添加了一些解释。