这是我正在使用的文本示例。
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() )