1

我正在寻找一个非常大的字符串中的字符串列表及其变体。

我想要做的是找到两个字符串之间的隐式匹配。

例如,如果我的起始字符串是foo-bar,我希望匹配到 find Foo-bAr foo Bar甚至 foo(bar.... 当然,foo-bar也应该返回一个匹配项。


编辑:更具体地说,我需要以下比赛。

  1. 字符串本身,不区分大小写。
  2. 用空格分隔任何字符的字符串
  3. 用括号分隔任何字符的字符串。

如何编写表达式来满足这些条件?

我意识到这可能需要一些棘手的正则表达式。问题是,我有大量需要搜索的字符串,而且我觉得正则表达式只是让它变得尽可能健壮的工具。

也许正则表达式不是最好的解决方案?

谢谢你们的帮助。我还在学习用正则表达式思考。

4

4 回答 4

2
>>> def findString(inputStr, targetStr):
...     if convertToStringSoup(targetStr).find(convertToStringSoup(inputStr)) != -1:
...             return True
...     return False
... 
>>> def convertToStringSoup(testStr):
...     testStr = testStr.lower()
...     testStr = testStr.replace(" ", "")
...     testStr = testStr.replace("(", "")
...     testStr = testStr.replace(")", "")
...     return testStr
... 
>>> 
>>> findString("hello", "hello")
True
>>> findString("hello", "hello1")
True
>>> findString("hello", "hell!o1")
False
>>> findString("hello", "hell( o)1")
True

应该根据您的规范工作。显然,可以优化。你在问我正在努力思考的正则表达式,并希望很快用一些好的东西来编辑这个问题。但是,如果这不是太慢,那么正则表达式可能会很糟糕,而且可读性通常更好!

我注意到你反复寻找同一个大干草堆。显然,您只需将其转换为“字符串汤”一次!

编辑:我一直在考虑正则表达式,你所做的任何正则表达式要么需要有很多子句,要么必须像我在这个答案中所做的那样在正则表达式之前修改文本。我没有对 string.find() 与 re.find() 进行基准测试,但我想在这种情况下前者会更快。

于 2013-08-05T23:20:11.497 回答
2

我将假设您的规则是正确的,而您的示例是错误的,主要是因为您后来添加了规则,作为澄清,在一堆问题之后。所以:

编辑:更具体地说,我需要以下比赛。

  1. 字符串本身,不区分大小写。
  2. 用空格分隔任何字符的字符串
  3. 用括号分隔任何字符的字符串。

最简单的方法是删除空格和括号,然后对结果进行不区分大小写的搜索。你甚至不需要正则表达式。例如:

haystack.replace(' ', '').replace('(', '').upper().find(needle.upper())
于 2013-08-05T23:20:25.763 回答
0

试试这个正则表达式:

[fF][oO]{2}[- ()][bB][aA][rR]

测试:

>>> import re
>>> pattern = re.compile("[fF][oO]{2}[- ()][bB][aA][rR]")
>>> m = pattern.match("foo-bar")
>>> m.group(0)
'foo-bar'
于 2013-08-05T23:06:15.740 回答
0

使用正则表达式,不区分大小写的搜索匹配大写/小写不变量,'[]' 匹配任何包含的字符和'|' 让您一次进行多个比较。将它们放在一起,您可以尝试:

import re
pairs = ['foo-bar', 'jane-doe']
regex = '|'.join(r'%s[ -\)]%s' % tuple(p.split('-')) for p in pairs)
print regex
results = re.findall(regex, your_text_here, re.IGNORECASE)
于 2013-08-05T23:20:38.937 回答