2012-07-11 54 views
1
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 

这个正则表达式返回我想要的ruby中的内容,但显然它并没有做到Python中预期的那样。任何人都可以帮助我驯服这个。 正则表达式的意图是基本上提取item4和item5之间的东西。正则表达式在Rubular中传递,但不在Python中

谢谢

enter image description here

+0

'\\ n *'它没有效果。它必须是:'[\ n] *'(或者'[\\ n] *'取决于你传递这个字符串)。 – Jack 2012-07-11 23:29:08

+0

谢谢,杰克。这个窍门也行不通。我尝试了两个建议,但没有运气.. – zsljulius 2012-07-11 23:39:54

+0

你检查了我的答案并检查了你确实在'file_txt'中有数据吗?另外'f'来自'bytes.decode(f)'? – 2012-07-11 23:40:38

回答

1

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

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

你不需要'$'。它所做的只是强制'\ s *'匹配换行符,所以你可以把它写成'\ n \ s *'。但是我很确定任何空格字符都会这样做,这就是为什么我在我的答案中使用了's +'。 – 2012-07-12 01:16:13

+0

@AlanMoore:不正确。 '\ s'可能会产生误报。 – jfs 2012-07-12 01:41:34

+0

太棒了!有用!我甚至不知道该点默认情况下不符合换行符!你救了我的一天! – zsljulius 2012-07-12 02:43:37

1

尝试使用原始字符串

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

我猜它与您的\n转义做。但是如果不知道你期望的匹配是什么,就不可能说出来。

+0

我会同意它的\ n转义......但没办法确定 – 2012-07-11 23:31:16

+0

感谢你的回复。不幸的是,原始字符串技巧不起作用。我想\\ n是正确的方法来获得'\ n'字面上是正确的? – zsljulius 2012-07-11 23:39:28

0

知道哪里是换行不帮你找到匹配的,所以没有必要专门匹配\n;它只是另一个空白字符。试试这个:

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

(?s)使.匹配换行符,所以.*?消耗一切,直到先行 - (?=Item\s*\d+\.) - 斑点下一个“项目”条目的开头。如果您想遍历所有项目,可以用\d+替换45

相关问题