我正在尝试将re.findall与look-behind和look-forward一起使用来提取数据。当我不使用raw_input变量时,正则表达式工作正常,但我需要用户能够输入各种不同的搜索词。
以下是当前代码:
me = re.findall(r"(?<='(.+)'+variable+'(.+)')(.*?)(?='(.+)+variable+(.+)')", raw)
正如您所看到的,我正试图在一个搜索词之间拉出字符串。
但是,每次我使用这种格式时,都会出现固定宽度错误。反正有吗?
我也尝试了以下格式但没有成功。
variable = raw_input('Term? ')
'.*' + variable + '.*'
和
'.*%s.*' % (variable, )
和
'.*{0}.*'.format(variable)
和
'.*{variable}.*'.format(variable=variable)
答案 0 :(得分:0)
通常实现lookbehind的方式(包括它的Python实现)有一个固有的限制,你不幸遇到:lookbehinds不能是变长的。 “关于Lookbehind的重要说明”部分here解释了原因。不过,我认为你应该能够在没有外观的情况下做正则表达式。
答案 1 :(得分: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
如果您真的希望结果中的最后一个'fish'与上面的评论一样,那么只需从{0}
字符串中删除第二个format()
。
答案 2 :(得分: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)
['regex是最好的']