我需要在目标字符串中找到前缀的单词列表(我希望将目标字符串中的匹配索引列表作为数组处理)。
目前,在不同场景下运行之后,我的Python代码仍无效。
以下源代码不起作用,因为我错误地设置了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!"
我缺少什么?
我应该如何设置txt_pattern
?
您能否使用最低工作示例向我推荐一个好的教程?目前,Google搜索第一页的标准教程非常详细,而且不易理解。
谢谢!
答案 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")]
当人们只需要一些字符串方法(例如split
,partition
,startswith
和一些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'
。