让两个角色之间的一切都跨越新的线



这是我正在使用的文本示例。

6(杰克出租车服务公司是出租车行业的新加入者。它在行业中占据了独特的地位,取得了成功。杰克出租车服务公司是如何获得这一职位的?

A( 以高于竞争对手;为比竞争对手更大的区域提供服务

B( 以低于竞争对手的价格提供长途出租车票价;为比竞争对手更小的区域提供服务

C( 以高于竞争对手;服务于与竞争对手相同的区域

D( 以低于竞争对手的价格提供长途出租车票价;服务于与竞争对手相同的区域

答案:D

我正在尝试匹配整个问题,包括答案选项。从问题编号到单词Answer的所有内容

这是我当前的正则表达式

((rf'(?<={searchCounter}) ).*?(?=Answer).*'), re.DOTALL)

SearchCounter只是一个与当前问题相对应的变量,在本例中为6。我认为这个问题与跨越新的界限进行搜索有关。

编辑:完整的源代码

searchCounter = 1
bookDict = {}
with open ('StratMasterKey.txt', 'rt') as myfile:
for line in myfile:
question_pattern = re.compile((rf'(?<={searchCounter}) ).*?(?=Answer).*'), re.DOTALL) 
result = question_pattern.search(line)
if result != None: 
bookDict[searchCounter] = result[0] 
searchCounter +=1

正则表达式失败的原因是您使用for line in myfile:逐行读取文件,而您的模式在单个多行字符串中搜索匹配项。

for line in myfile:替换为contents = myfile.read(),然后使用result = question_pattern.search(contents)获得第一个匹配,或者使用result = question_pattern.findall(contents)获得多个匹配。

关于正则表达式的一点注意:我并没有修复整个模式,因为正如您所提到的,它超出了这个问题的范围,但由于字符串输入现在是一个多行字符串,您需要删除re.DOTALL并使用[sS]来匹配模式中的任何字符,使用.来匹配除换行符之外的任何字符。此外,环视控制是多余的,您可以安全地用Answer替换(?=Answer)。此外,为了检查是否存在匹配,您可以简单地使用if result:,然后通过访问result.group()获取整个匹配值。

完整代码片段:

with open ('StratMasterKey.txt', 'rt') as myfile:
contents = myfile.read()
question_pattern = re.compile((rf'(?<={searchCounter}) )[sS]*?Answer.*')) 
result = question_pattern.search(contents)
if result: 
print( result.group() )

最新更新