Python:需要固定长度正则表达式吗?

时间:2012-06-25 21:26:50

标签: c# python regex lookbehind

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

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(格式。

3 个答案:

答案 0 :(得分:3)

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

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

您说您对结束标记很灵活,如果)!>可能出现在代码的其他位置,您可能需要考虑将结束标记更改为)!/inc>(或任何内容,只要因为它是独一无二的。)

See it run.

答案 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似乎认为应该将其转义。