首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >跨新行获得两个字符之间的所有信息

跨新行获得两个字符之间的所有信息
EN

Stack Overflow用户
提问于 2020-04-23 14:43:59
回答 1查看 82关注 0票数 2

这是我正在处理的文本的样本。

6)杰克的出租车服务是出租车行业的一个新进入者。它通过在行业中占据独特的地位而取得了成功。杰克的出租车服务是如何实现这一目标的?

( A)提供比竞争对手更高的长途计程车费;为比竞争对手更大的区域提供服务。

( B)以低于竞争对手的价格提供长途计程车费;服务范围比竞争对手小

( C)提供比竞争对手更高的长途计程车费;服务范围与竞争对手相同。

D)以低于竞争对手的价格提供长途计程车费;服务范围与竞争对手相同。

答:d

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

这是我当前的regex表达式

代码语言:javascript
运行
复制
((rf'(?<={searchCounter}\) ).*?(?=Answer).*'), re.DOTALL)

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

编辑:完整源代码

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-24 08:25:07

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

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

regex上的注意事项:我没有修复整个模式,因为正如您所提到的,它超出了这个问题的范围,但是由于字符串输入现在是一个多行字符串,您需要删除re.DOTALL并使用[\s\S]来匹配模式中的任何字符,使用.来匹配任何字符(除了断行字符)。另外,查找结构是多余的,您可以安全地用(?=Answer)替换Answer。另外,要检查是否有匹配,只需使用if result:,然后通过访问result.group()获取整个匹配值。

完整代码片段:

代码语言:javascript
运行
复制
with open ('StratMasterKey.txt', 'rt') as myfile:
    contents = myfile.read()
    question_pattern = re.compile((rf'(?<={searchCounter}\) )[\s\S]*?Answer.*')) 
    result = question_pattern.search(contents)
    if result: 
        print( result.group() )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61389990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档