3

我正在尝试将 re.findall 与后视和前瞻一起使用来提取数据。当我不使用 raw_input 变量时,正则表达式可以正常工作,但我需要用户能够输入各种不同的搜索词。

这是当前代码:

me = re.findall(r"(?<='(.+)'+variable+'(.+)')(.*?)(?='(.+)+variable+(.+)')", raw)

如您所见,我试图在一个搜索词之间提取字符串。

但是,每次我使用这种格式时,都会出现固定宽度错误。有没有办法解决?

我也尝试了以下格式但没有成功。

variable = raw_input('Term? ')
'.*' + variable + '.*'

'.*%s.*' % (variable, )

'.*{0}.*'.format(variable)

 '.*{variable}.*'.format(variable=variable)
4

3 回答 3

0

通常实现lookbehind的方式(包括它的Python实现)有一个固有的限制,不幸的是你遇到了:lookbehinds不能是可变长度的。此处的“关于 Lookbehind 的重要说明”部分解释了原因。不过,我认为您应该能够在不向后看的情况下执行正则表达式。

于 2012-12-27T18:52:52.037 回答
0

我不确定这是否是你的意思,但它可能会让你开始。据我了解您的问题,您不需要前瞻或后视。这适用于 Python 2.x(不适用于 Python 3):

>>> import re
>>> string_to_search = 'fish, hook, swallowed, reeled, boat, fish'
>>> entered_by_user = 'fish'
>>> search_regex = r"{0}(.+){0}".format(entered_by_user)
>>> match = re.search(search_regex, string_to_search)
>>> if match:
...     print "result:", match.group(1).strip(' ,')
...
result: hook, swallowed, reeled, boat

如果您真的想要结果中的最后一个“鱼”,如上面的评论所示,那么只需{0}format()字符串中删除第二个。

于 2012-12-27T20:03:18.660 回答
0

此解决方案应该有效:

me = re.findall(rf"(?<='(.+)'+{variable}+'(.+)')(.*?)(?='(.+)+{variable}+(.+)')", raw)

您还可以根据需要添加许多不同的变量。在 {} 之间为正则表达式和所需变量添加rf

import re

text = "regex is the best"    
var1 = "is the"
var2 = "best"
yes = re.findall(rf"regex {var1} {var2}", text)

print(yes)

['正则表达式是最好的']

于 2020-11-05T02:09:36.633 回答