2012-07-11 53 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

相關問題