Python正则表达式,在目标字符串中搜索前缀

时间:2012-03-15 18:56:30

标签: python regex case-insensitive prefix

我需要在目标字符串中找到前缀的单词列表(我希望将目标字符串中的匹配索引列表作为数组处理)。

  • 我认为使用正则表达式应该是最干净的方式。
  • 鉴于我正在寻找模式“foo”,我想在目标字符串中检索“foo”,“Foo”,“fooing”,“Fooing”等字样。
  • 鉴于我正在寻找模式“foo bar”,我想检索目标字符串模式,如“foo bar”,“Foo bar”,“foo Bar”,“foo baring”(它们仍然是所有都作为前缀处理,我是对的吗?)

目前,在不同场景下运行之后,我的Python代码仍无效。

  • 我假设我必须使用 ^ 来匹配目标字符串中的字词的开头(即前缀)。
  • 我假设我必须使用 ^ [fF] 这样的内容,以不区分大小写与我的前缀的第一个字母
  • 我假设我应该使用像“。*”之类的东西让regexp表现得像前缀
  • 我假设我应该使用 \ prefix1 | prefix2 | prefix3 **在要搜索的模式中输入**逻辑或许多不同的前缀

以下源代码不起作用,因为我错误地设置了txt_pattern

import re

#              '            '           '            '                     '             '           '
txt_str = "edb foooooo jkds Fooooooo kj fooing jdcnj Fooing ujndn ggng sxk foo baring sh foo Bar djw Foo";
txt_pattern = ''#???

out_obj = re.match(txt_pattern,txt_str)
if out_obj:
   print "match!"
else:
   print "No match!"
  1. 我缺少什么?

  2. 我应该如何设置txt_pattern

  3. 您能否使用最低工作示例向我推荐一个好的教程?目前,Google搜索第一页的标准教程非常详细,而且不易理解。

  4. 谢谢!

5 个答案:

答案 0 :(得分:3)

  

我假设我必须使用^来匹配目标字符串中单词的开头(即前缀)。

不,^是一个只匹配字符串开头的锚点。您可以使用\b来表示单词边界(但请记住在字符串文字中转义反斜杠,或使用原始字符串文字)。

您还必须使用re.search而不是re.match,因为后者仅检查字符串的开头,而前者在字符串中的任何位置搜索匹配。

答案 1 :(得分:3)

>>> s = 'Foooooo jkds Fooooooo kj fooing jdcnj Fooing ujndn ggng sxk foo baring sh foo Bar djw Foo'
>>> regex = '((?i)(foo)(\w+)?)'
>>> compiled = re.compile(regex)
>>> re.findall(compiled, s)
[('Foooooo', 'Foo', 'oooo'), ('Fooooooo', 'Foo', 'ooooo'), ('fooing', 'foo', 'ing'), ('Fooing', 'Foo', 'ing'), ('foo', 'foo', ''), ('foo', 'foo', ''), ('Foo', 'Foo', '')]

(?i) - >不区分大小写 (foo) - > group1匹配foo
(\w+) - > group2匹配所有其他单词字符

>>> print [i[0] for i in re.findall(compiled, s)]
['Foooooo', 'Fooooooo', 'fooing', 'Fooing', 'foo', 'foo', 'Foo']

答案 2 :(得分:3)

正则表达式是错误的方法。首先将字符串解析为字符串列表,每个项目只有一个单词。然后使用带有过滤器的列表推导。字符串上的split方法是获取单词列表的好方法,那么您只需执行[item for item in wordlist if item.startswith("foo")]

当人们只需要一些字符串方法(例如splitpartitionstartswith和一些pythonic列表推导或生成器)时,人们会花费很多时间来使用复杂的正则表达式来破解效率低下的代码。

正则表达式有它们的用途,但简单的字符串解析不是其中之一。

答案 3 :(得分:1)

尝试使用此工具测试一些内容:http://www.pythonregex.com/

使用此参考:docs.python.org/howto/regex.html

答案 4 :(得分:0)

我会为你的正则表达式使用这样的东西:

\b(?:([Ff]oo [Bb]ar)|([Ff]oo))\w*

在非捕获组内部,您应该将每个前缀与|分开,我还将每个前缀放在其自己的捕获组中,以便您可以确定给定字符串匹配的前缀,例如:

for match in re.finditer(r'\b(?:([Ff]oo [Bb]ar)|([Ff]oo))\w*', txt_str):
    n = 1
    while not match.group(n):
        n += 1
    print "Prefix %d matched '%s'" % (n, match.group(0))

输出:

Prefix 2 matched 'foooooo'
Prefix 2 matched 'Fooooooo'
Prefix 2 matched 'fooing'
Prefix 2 matched 'Fooing'
Prefix 1 matched 'foo baring'
Prefix 1 matched 'foo Bar'
Prefix 2 matched 'Foo'

请确保先添加较长的前缀,如果您要将foo前缀放在foo bar前缀之前,则只能匹配'foo'中的'foo bar'