0

我有这个使用向前和向后预测的正则表达式:

import re
re.compile("<!inc\((?=.*?\)!>)|(?<=<!inc\(.*?)\)!>")

我正在尝试将它从 C# 移植到 Python,但不断收到错误消息

look-behind requires fixed-width pattern

是否可以在不失去意义的情况下用 Python 重写它?

这个想法是让它匹配类似的东西

<!inc(C:\My Documents\file.jpg)!>

更新

我正在使用环视来解析我修改过的 HTTP 多部分文本

body = r"""------abc
Content-Disposition: form-data; name="upfile"; filename="file.txt"
Content-Type: text/plain

<!inc(C:\Temp\file.txt)!>
------abc
Content-Disposition: form-data; name="upfile2"; filename="pic.png"
Content-Type: image/png

<!inc(C:\Temp\pic.png)!>
------abc
Content-Disposition: form-data; name="note"

this is a note
------abc--
"""

multiparts = re.compile(...).split(body)

我只想在进行拆分时获取文件路径和其他文本,而不必删除开始和结束标签

<!inc(代码简洁很重要,但如果它使正则表达式可行,我愿意更改格式。

4

3 回答 3

4

从文档中:

(?<!...)

如果字符串中的当前位置之前没有匹配 ...,则匹配。这称为否定后向断言。与肯定的后向断言类似,包含的模式必须只匹配一些固定长度的字符串。以否定后向断言开头的模式可能在被搜索的字符串的开头匹配。

(?<=...)

如果字符串中的当前位置前面有一个在当前位置结束的 ... 匹配,则匹配。这称为肯定的后向断言。(?<=abc)def 将在 abcdef 中找到匹配项,因为后视将备份 3 个字符并检查包含的模式是否匹配。包含的模式必须只匹配一些固定长度的字符串,这意味着 abc 或 a|b 是允许的,但 a* 和 a{3,4} 是不允许的。请注意,以肯定的后向断言开头的模式在被搜索的字符串的开头不会匹配;您很可能希望使用 search() 函数而不是 match() 函数:

强调我的。不,我不认为您可以将其以当前形式移植到 Python。

于 2012-06-25T21:33:02.153 回答
3

对于同一数组中的路径+“所有内容”,只需在开始和结束标签上拆分:

import re
p = re.compile(r'''<!inc\(|\)!>''')
awesome = p.split(body)

您说您对结束标签很灵活,如果)!>可以在代码的其他地方出现,您可能需要考虑将结束标签更改为类似的东西)!/inc>(或任何东西,只要它是唯一的)。

看它运行。

于 2012-06-25T21:33:15.310 回答
1
import re

pat = re.compile("\<\!inc\((.*?)\)\!\>")

f = pat.match(r"<!inc(C:\My Documents\file.jpg)!>").group(1)

结果是f == 'C:\My Documents\file.jpg'

回应乔恩克莱门茨:

print re.escape("<!inc(filename)!>")

结果是

\<\!inc\(filename\)\!\>

结论:re.escape似乎认为他们应该逃脱。

于 2012-06-25T21:36:22.067 回答