查找字符串中由未知字符数分隔的两个单词,正则表达式,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
'''

test the regex