查找字符串中由未知字符数分隔的两个单词,正则表达式,python
Find two words in a string separated by an unknow number of characters, regular expression, python
我目前正在构建一个网络抓取工具。我想找到与由两个词(WORD1、WORD2)指定的位置匹配的配置文件。
该位置的配置文件的网页源代码结构始终相同:
WORD1(最多100个字符,包括换行符和特殊字符)WORD2。
我不希望实例仅由一个 space 分隔,因为它会与地址的另一个实例混淆,这是通用的网页而不是配置文件,因此长度必须大于 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('-')
逐个检查每个迭代非常耗时、低效且最终不准确,因为我注意到源代码至少有三个迭代,但可能更多,我会错过那些。
我希望有一个正则表达式来查找由任何字符分隔的单词 'WORD1' 和 'WORD2',包括换行符、最多 100 个字符和超过 1 个字符。或者,实现这一目标的最佳方法是什么?
谢谢!
IIUC,你可以使用延迟扩展 {2,99}?
的字符范围(包括 2 到 99,如果你也想包括 100,请使用 {2,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
'''
我目前正在构建一个网络抓取工具。我想找到与由两个词(WORD1、WORD2)指定的位置匹配的配置文件。 该位置的配置文件的网页源代码结构始终相同: WORD1(最多100个字符,包括换行符和特殊字符)WORD2。 我不希望实例仅由一个 space 分隔,因为它会与地址的另一个实例混淆,这是通用的网页而不是配置文件,因此长度必须大于 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('-')
逐个检查每个迭代非常耗时、低效且最终不准确,因为我注意到源代码至少有三个迭代,但可能更多,我会错过那些。
我希望有一个正则表达式来查找由任何字符分隔的单词 'WORD1' 和 'WORD2',包括换行符、最多 100 个字符和超过 1 个字符。或者,实现这一目标的最佳方法是什么? 谢谢!
IIUC,你可以使用延迟扩展 {2,99}?
的字符范围(包括 2 到 99,如果你也想包括 100,请使用 {2,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
'''