正则表达式解析python中的对话

正则表达式解析python中的对话,python,regex,Python,Regex,我想用python解析文件中的三种类型的行: “Name”“有话要说!” “只是一个描述性的句子” 名称“有话要说!” 我想知道名字和句子,如果没有名字,就说背景。我使用re读取文件的每一行,以查看正则表达式是否匹配。除此之外,它的工作原理非常好: “Name”“有话要说!” 它只返回整个内容,而不是两个部分 这是我的正则表达式: r“(\”[a-zA-z?]*\”[a-zA-z]*)\s\”(.+)\” 您可以使用带有反向引用的捕获组来匹配或不匹配附带的双引号 然后,您可以将整个第一部分(

我想用python解析文件中的三种类型的行:

“Name”“有话要说!”
“只是一个描述性的句子”
名称“有话要说!”
我想知道名字和句子,如果没有名字,就说背景。我使用
re
读取文件的每一行,以查看正则表达式是否匹配。除此之外,它的工作原理非常好:

“Name”“有话要说!”
它只返回整个内容,而不是两个部分

这是我的正则表达式:

r“(\”[a-zA-z?]*\”[a-zA-z]*)\s\”(.+)\”

您可以使用带有反向引用的捕获组来匹配或不匹配附带的双引号

然后,您可以将整个第一部分(包括空格字符)设置为可选,并在双引号之间匹配第二部分

请注意,
[a-zA-z]
[a-zA-z]
大,字符类中的
与问号完全匹配

比赛分为第一组和第三组

(?:(("?)[a-zA-Z]+\2)\s)?("[^"]+")
  • (?:
    非捕获组
    • Capturegroup 1
      • (“?)
        在组2中捕获可选的
      • [a-zA-Z]+
        匹配a+乘以字符a-zA-Z a
      • \2
        对组2的反向引用,以精确匹配该组中匹配的内容
    • )\s
      关闭组1并匹配空白字符
  • )?
    关闭非捕获组并将其设置为可选
  • (“[^”]+”
    捕获组3,从
    匹配到
见a |

使用re.finditer循环匹配的示例:

import re

regex = r"(?:((\"?)[a-zA-Z]+\2)\s)?(\"[^\"]+\")"
s = ("\"Name\" \"Something to say !\"\n"
            "\"Just a descriptive sentence\"\n"
            "name \"Something to say !\"\n"
            "\"Name\" \"Something to say !\"")

matches = re.finditer(regex, s)
for matchNum, match in enumerate(matches, start=1):
        print(f"Name: {match.group(1)} Sentence: {match.group(3)}")
输出

Name: "Name" Sentence: "Something to say !"
Name: None Sentence: "Just a descriptive sentence"
Name: name Sentence: "Something to say !"
Name: "Name" Sentence: "Something to say !"

您可以使用带有反向引用的
捕获组来匹配或不匹配附带的双引号

然后,您可以将整个第一部分(包括空格字符)设置为可选,并在双引号之间匹配第二部分

请注意,
[a-zA-z]
[a-zA-z]
大,字符类中的
与问号完全匹配

比赛分为第一组和第三组

(?:(("?)[a-zA-Z]+\2)\s)?("[^"]+")
  • (?:
    非捕获组
    • Capturegroup 1
      • (“?)
        在组2中捕获可选的
      • [a-zA-Z]+
        匹配a+乘以字符a-zA-Z a
      • \2
        对组2的反向引用,以精确匹配该组中匹配的内容
    • )\s
      关闭组1并匹配空白字符
  • )?
    关闭非捕获组并将其设置为可选
  • (“[^”]+”
    捕获组3,从
    匹配到
见a |

使用re.finditer循环匹配的示例:

import re

regex = r"(?:((\"?)[a-zA-Z]+\2)\s)?(\"[^\"]+\")"
s = ("\"Name\" \"Something to say !\"\n"
            "\"Just a descriptive sentence\"\n"
            "name \"Something to say !\"\n"
            "\"Name\" \"Something to say !\"")

matches = re.finditer(regex, s)
for matchNum, match in enumerate(matches, start=1):
        print(f"Name: {match.group(1)} Sentence: {match.group(3)}")
输出

Name: "Name" Sentence: "Something to say !"
Name: None Sentence: "Just a descriptive sentence"
Name: name Sentence: "Something to say !"
Name: "Name" Sentence: "Something to say !"
解决方案 在我看来,您最好的选择是使用命名的捕获组。以下是方法:

重新导入
行=[
“说出”“要说的话!”,
“只是一个描述性的句子”,
“说出”要说的话
]
p=重新编译(r“(\”?(?p.+)\”?)(\”(?p.+)\”))
对于行中的行:
m=p.搜索(行)
打印(m[“part1”])
打印(m[“第二部分”])
输出将是

Name
Something to say !
None
Just a descriptive sentence
name
Something to say !
解释 regex
(\“?(?p.+)\”?(\“(?p.+)\”)包含两个主要部分。我会看第一个,
(\”?(?P.+)\”?
。第二个非常相似

  • 带有“零或多”量词的外部组
    (…)?
    。因此,在第二种情况下,只有“part2”捕获组将处于活动状态
  • 在该组中,引号还标有“零或多”量词,以涵盖第三种情况:
    \”?
  • 零件
    (?P.+?)
    匹配引号之间的文本,并指定名称“零件1”,以便于访问。
    • 匹配所有符号
    • +?
      惰性地匹配一个或多个前一个引号(根据需要尽可能多的字符,尽可能少)。这是从匹配中排除第二个引号所必需的
使用这个正则表达式,您可以通过方括号语法访问命名捕获组的内容,如上面的代码所示

捕捉引用 如果您不仅想捕获引号中的文本,还想捕获引号本身,只需将
\“
移动到命名的捕获组中,如:
((?p\“?。+?\”)?((?p\“+”))

解决方案 在我看来,您最好的选择是使用命名的捕获组。以下是方法:

重新导入
行=[
“说出”“要说的话!”,
“只是一个描述性的句子”,
“说出”要说的话
]
p=重新编译(r“(\”?(?p.+)\”?)(\”(?p.+)\”))
对于行中的行:
m=p.搜索(行)
打印(m[“part1”])
打印(m[“第二部分”])
输出将是

Name
Something to say !
None
Just a descriptive sentence
name
Something to say !
解释 regex
(\“?(?p.+)\”?(\“(?p.+)\”)包含两个主要部分。我会看第一个,
(\”?(?P.+)\”?
。第二个非常相似

  • 带有“零或多”量词的外部组
    (…)?
    。因此,在第二种情况下,只有“part2”捕获组将处于活动状态
  • 在该组中,引号还标有“零或多”量词,以涵盖第三种情况:
    \”?
  • 零件
    (?P.+?)
    匹配引号之间的文本,并指定名称“零件1”,以便于访问。
    • 匹配所有符号
    • +?
      惰性地匹配一个或多个前一个引号(根据需要尽可能多的字符,尽可能少)。这是从匹配中排除第二个引号所必需的
使用这个正则表达式,您可以通过方括号语法访问命名捕获组的内容,如上面的代码所示

捕捉引用 如果你愿意