首页 > 解决方案 > 匹配相似但不相同的字符串

问题描述

我有两个csv。一个带有大量文本,另一个带有注释/字符串。我想在文本中找到注释的位置。问题是一些注释有额外的空格/字符不在文本中。我无法从原始文本中修剪空白/字符,因为我需要确切的位置。我开始使用正则表达式,但似乎没有办法搜索部分匹配。

例子

text = ' K. Meney & L. Pantelic, Int. J. Sus. Dev. Plann. Vol. 10, No. 4 (2015) 544?561\n? 2015 WIT Press, www.witpress.com\nISSN: 1743-7601 (paper format), ISSN: 1743-761X (online), http://www.witpress.com/journals\nDOI: 10.2495/SDP-V10-N4-544-561\nNOVEL DECISION MODEL FOR DELIVERING SUSTAINABLE \nINFRASTRUCTURE SOLUTIONS ? AN AUSTRALIAN  \nCASE STUDY\nK. MENEY & L. PANTELIC\nSyrinx Environmental PL, Australia.\nABSTRACT\nConventional approaches to water supply and wastewater treatment in regional towns globally are failing \ndue to population growth and resource pressure, combined with prohibitive costs of infrastructure upgrades.  '


seg = 'water  supply and wastewater  ¿treatment'

 m = re.search(seg, text, re.M | re.DOTALL | re.I) 

这在大约 15% 的赛段上匹配

m = re.match(r'(water).*(treatment)$', text, re.M) 

这不起作用,我认为可以匹配第一个词和最后一个词并获得他们的位置,但这有很多问题,例如多次出现“水”

with open(file_path) as file, \
            mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ) as s:
                if s.find(seg) != -1:
                    print('true')

由于某种原因,我对此完全没有运气。
我在其中任何一个方面都走在正确的道路上,还是有更好的方法来做到这一点?

额外的例子

来自文本
SIDM?模型应用于一个快速发展的澳大利亚乡镇 (Hopetoun)

来自 Seg
SIDM 模型被应用于一个快速发展的澳大利亚乡镇 (Hopetoun)

来自文本
\nSIDM?旨在用作设计和评估工具。作为一种设计工具,它 i) 指导\n可持续基础设施解决方案的设计,ii) 可用作评估项目完成程度的进度检查,iii) 突出现有信息集中的差距,以及 iv)本质上提供了推进设计过程所需的工作范围。作为一种评估工具,它既可以作为一种快速诊断工具,用于检查解决方案是否存在重大缺陷或是否普遍\n可接受,也可以作为一种详细的评估工具,可以在\n中详细比较各种选项,以确定一个优选的解决方案。

Seg
SIDM 旨在用作设计和评估工具。作为一种设计工具,它 i) 指导可持续基础设施解决方案的设计,ii) 可用作评估项目完成水平的进度检查,iii) 突出现有信息集中的差距,以及 iv)最终提供了推进设计过程所需的工作范围。作为一种评估工具,它既可以作为快速诊断工具,检查解决方案是否存在重大缺陷或普遍可接受,也可以作为详细评估工具,可以详细比较各种选项以建立首选解决方案.

匹配前要分段的子列表:

seg = re.sub(r'\(', r'\\(', seg ) #Need to escape paraenthesis due to regex
seg = re.sub(r'\)', r'\\)', seg )
seg = re.sub(r'\?', r' ', seg )
seg = re.sub(r'[^\x00-\x7F]+',' ', seg)
seg = re.sub(r'\s+', ' ', seg)
seg = re.sub(r'\\r', ' ', seg)

标签: pythonregexpython-3.x

解决方案


正如 casimirethippolyte 指出的那样, patseg = re.sub(r'\W+', '\W+', seg) 为我解决了这个问题。


推荐阅读