正则表达式通过Rubular而不是Python

时间:2012-07-11 23:24:28

标签: python regex python-3.x

import re
import urllib.request
file_txt = urllib.request.urlopen("ftp://ftp.sec.gov/edgar/data/1408597/0000930413-12-003922.txt")
pattern_item4= re.compile("(Item\\n*\s*4.*)Item\\n*\s*5")
print(re.search(pattern_item4,bytes.decode(f)))
#Returns None

这个正则表达式以rubular方式返回我想要的内容,但显然它没有达到Python中的预期效果。有人会帮我解决这个问题。 正则表达式的目的是基本上在item4和item5之间提取东西。

谢谢

enter image description here

3 个答案:

答案 0 :(得分:1)

尝试使用原始字符串

re.compile (r"(Item\\n*\s*4.*)Item\\n*\s*5")

我猜这与你逃离\n有关。但是如果不确切地知道你期望匹配的是什么,就不可能分辨出来。

答案 1 :(得分:1)

你需要re.DOTALL标志,否则.与换行符不匹配。要在EOL上匹配Item,您可以将$与re.MULTILINE标志一起使用:

pattern = re.compile(r"(Item$\s*4.*)Item$\s*5", re.S | re.M)

答案 2 :(得分:0)

知道换行符的位置无法帮助您找到匹配项,因此无需专门匹配\n;它只是另一个空白角色。试试这个:

r"(?s)Item\s+4\..*?(?=Item\s+5\.)"

(?s)使.能够匹配换行符,因此.*?会消耗所有内容,直到前瞻 - (?=Item\s*\d+\.) - 找到下一个“项目”条目的开头。如果您想迭代所有项目,可以将45替换为\d+