你可以使用Python正则表达式从偏移量向后搜索吗?

Irw*_*win 8 python regex python-2.7

给定一个字符串,以及该字符串中的字符偏移量,我可以使用Python正则表达式向后搜索吗?

我试图解决的实际问题是在字符串中的特定偏移处获得匹配的短语,但我必须匹配该偏移之前的第一个实例.

在我有一个长度为一个符号的正则表达式的情况下(例如:单词边界),我正在使用一个解决方法来反转字符串.

my_string = "Thanks for looking at my question, StackOverflow."
offset = 30
boundary = re.compile(r'\b')
end = boundary.search(my_string, offset)
end_boundary = end.start()
end_boundary
Run Code Online (Sandbox Code Playgroud)

产量:33

end = boundary.search(my_string[::-1], len(my_string) - offset - 1)
start_boundary = len(my_string) - end.start()
start_boundary
Run Code Online (Sandbox Code Playgroud)

产量:25

my_string[start_boundary:end_boundary]
Run Code Online (Sandbox Code Playgroud)

输出:'问题'

但是,如果我有一个可能涉及多个字符的更复杂的正则表达式,这种"反向"技术将无法工作.例如,如果我想匹配在指定偏移量之前出现的第一个"ing"实例:

my_new_string = "Looking feeding dancing prancing"
offset = 16 # on the word dancing
m = re.match(r'(.*?ing)', my_new_string) # Except looking backwards
Run Code Online (Sandbox Code Playgroud)

理想输出:喂食

我可以使用其他方法(将文件拆分为行,并向后遍历行)但向后使用正则表达式似乎是一个概念上更简单的解决方案.

per*_*eal 7

使用正向lookbehind确保单词前至少有30个字符:

# re like: r'.*?(\w+)(?<=.{30})'
m = re.match(r'.*?(\w+)(?<=.{%d})' % (offset), my_string)
if m: print m.group(1)
else: print "no match"
Run Code Online (Sandbox Code Playgroud)

对于另一个例子,负面观察可能会有所帮助:

my_new_string = "Looking feeding dancing prancing"
offset = 16
m = re.match(r'.*(\b\w+ing)(?<!.{%d})' % offset, my_new_string)
if m: print m.group(1)
Run Code Online (Sandbox Code Playgroud)

哪个第一个贪婪匹配任何角色但回溯直到它无法向后匹配16个字符((?<!.{16})).