我目前正在構建一個網路爬蟲。我想找到與兩個單詞(WORD1、WORD2)指定的位置匹配的組態檔。該位置的組態檔的網頁源代碼結構始終相同:WORD1(最多 100 個字符,包括換行符和特殊字符)WORD2。我不希望實體僅由一個空格分隔,因為它會與地址的另一個實體混淆,這對于網頁而不是組態檔是通用的,因此長度必須大于 1 且小于 100。
以下示例:
'WORD1</span></span><br />\\r\\n\\t<span style="line-height: 19.84px;">WORD2'
'WORD1<br />\\r\\n\\tWORD2'
'WORD1</span><br />\\r\\n\\tWORD2'
and not 'WORD1 WORD2'
現在我使用代碼:
hits=[]
keywords = ['WORD1<br />\\r\\n\\tWORD2', 'WORD1</span><br />\\r\\n\\tWORD2', 'WORD1</span></span><br />\\r\\n\\t<span style="line-height: 19.84px;">WORD2']
for ulr in ulr_list:
req = Requests(url, headers={'User-Agent': 'Mozilla/5.0'})
webpage = urlopen(req).read()
for i in keywords:
if i in str(webpage):
hits.append('WORD2')
else:
hits.append('-')
逐個檢查每個迭代是耗時、低效且最終不準確的,因為我注意到源代碼至少有三個迭代,但可能還有更多,我會錯過這些。
我希望有一個正則運算式來查找由任何字符(包括換行符、最多 100 個字符和超過 1 個字符)分隔的單詞 'WORD1' 和 'WORD2' 。或者,實作這一目標的最佳方法是什么?謝謝!
uj5u.com熱心網友回復:
IIUC,您可以使用惰性擴展的一系列字符{2,99}?(包括 2 到 99,{2,100}如果您還想包括 100,請使用),負前瞻(?!WORD1)以防止匹配內部 WORD1,并re.DOTALL匹配換行符:
re.findall(r'WORD1(?:(?!WORD1).){2,99}?WORD2', text, re.DOTALL)
或者如果你想允許一個字符,除了空格:
re.findall(r'WORD1\S(?:(?!WORD1).){2,98}?WORD2', text, re.DOTALL)
輸出:
['WORD1</span></span><br />\n\t<span style="line-height: 19.84px;">WORD2',
'WORD1<br />\n\tWORD2',
'WORD1</span><br />\n\rWORD2']
或者,僅對于單詞之間的內容,添加一個捕獲組:
re.findall(r'WORD1((?:(?!WORD1).){2,99}?)WORD2', text, re.DOTALL)
輸出:
['</span></span><br />\n\t<span style="line-height: 19.84px;">',
'<br />\n\t',
'</span><br />\n\r']
測驗輸入(添加額外的 WORD1/WORD2 以證明與關鍵字排除的最小匹配):
text = '''WORD1 xx WORD1</span></span><br />
\t<span style="line-height: 19.84px;">WORD2 xx WORD2WORD1<br />
\tWORD2WORD1</span><br />
\rWORD2
'''
測驗正則運算式
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/448811.html
