正则表达式解析python中的对话
我想用python解析文件中的三种类型的行:正则表达式解析python中的对话,python,regex,Python,Regex,我想用python解析文件中的三种类型的行: “Name”“有话要说!” “只是一个描述性的句子” 名称“有话要说!” 我想知道名字和句子,如果没有名字,就说背景。我使用re读取文件的每一行,以查看正则表达式是否匹配。除此之外,它的工作原理非常好: “Name”“有话要说!” 它只返回整个内容,而不是两个部分 这是我的正则表达式: r“(\”[a-zA-z?]*\”[a-zA-z]*)\s\”(.+)\” 您可以使用带有反向引用的捕获组来匹配或不匹配附带的双引号 然后,您可以将整个第一部分(
“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+乘以字符a-zA-Z a[a-zA-Z]+
对组2的反向引用,以精确匹配该组中匹配的内容\2
关闭组1并匹配空白字符)\s
关闭非捕获组并将其设置为可选)?
捕获组3,从(“[^”]+”
匹配到“
”
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+乘以字符a-zA-Z a[a-zA-Z]+
对组2的反向引用,以精确匹配该组中匹配的内容\2
关闭组1并匹配空白字符)\s
关闭非捕获组并将其设置为可选)?
捕获组3,从(“[^”]+”
匹配到“
”
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”,以便于访问。
匹配所有符号
+?
惰性地匹配一个或多个前一个引号(根据需要尽可能多的字符,尽可能少)。这是从匹配中排除第二个引号所必需的
使用这个正则表达式,您可以通过方括号语法访问命名捕获组的内容,如上面的代码所示
捕捉引用
如果你愿意