我有这个使用前向和后向前瞻的正则表达式:
import re
re.compile("<!inc\((?=.*?\)!>)|(?<=<!inc\(.*?)\)!>")
我正在尝试将其从C#移植到Python但仍然收到错误
look-behind requires fixed-width pattern
是否可以在Python中重写此内容而不会失去意义?
这个想法是为了匹配像
这样的东西<!inc(C:\My Documents\file.jpg)!>
更新
我正在使用lookarounds来解析我修改的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(
格式。
答案 0 :(得分:3)
对于同一数组中的路径+“所有内容”,只需拆分开始和结束标记:
import re
p = re.compile(r'''<!inc\(|\)!>''')
awesome = p.split(body)
您说您对结束标记很灵活,如果)!>
可能出现在代码的其他位置,您可能需要考虑将结束标记更改为)!/inc>
(或任何内容,只要因为它是独一无二的。)
答案 1 :(得分:2)
来自文档:
(?<!...)
匹配,如果字符串中的当前位置前面没有匹配....这称为负后观断言。与正向lookbehind断言类似,包含的模式必须仅匹配某些固定长度的字符串。以负向lookbehind断言开头的模式可能在被搜索字符串的开头匹配。
(?<=...)
匹配,如果字符串中的当前位置前面有匹配的...,它在当前位置结束。这被称为积极的外观断言。 (?&lt; = abc)def将在abcdef中找到匹配项,因为lookbehind将备份3个字符并检查包含的模式是否匹配。包含的模式必须只匹配一些固定长度的字符串,这意味着允许使用abc或a | b,但a *和a {3,4}不允许。请注意,以正向后向断言开头的模式在搜索字符串的开头不匹配;你很可能想要使用search()函数而不是match()函数:
强调我的。不,我不认为你可以用它的当前形式将它移植到Python。
答案 2 :(得分: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'
回应Jon Clements:
print re.escape("<!inc(filename)!>")
结果
\<\!inc\(filename\)\!\>
结论:re.escape
似乎认为应该将其转义。