繁体   English   中英

Python 正则表达式 findall 匹配所有单词对

[英]Python regex findall matching all pairs of words

我需要使用正则表达式在字符串中按顺序列出每对单词,代码的相关部分是这样的:

for word in re.findall(r'\w+\b.*?\w+', text):

现在让我们以文本“这是一个随机文本”为例,我想要的是这样的列表:

['这是','是一个','一个随机','随机文本']

相反,我得到的是:

['这是','随机']

我怎样才能解决这个问题? 提前致谢。

您说单词由随机数量的空格和/或标点符号分隔,我为此使用了[\s\.]+

你在这里做错的是你正在消费第二个单词,你需要的是一个匹配第二个单词但不消费它的积极前瞻,所以下次它会匹配它。 因为你说这是一个巨大的文本,我认为使用finditerfindall更好,不同之处在于它返回一个生成器,该生成器产生与findall返回的相同元素:

import re

text ="""This. is a random text"""

pattern = re.compile(r'(\w+[\s\.]+)(?=(\w+))')
for match in pattern.finditer(text):
    # rebuild the word
    element = ''.join(match.groups())
    print(element)

输出:

This. is
is a
a random
random text

请注意,默认情况下,正向前瞻不是捕获组,这就是为什么我这样做(?=(\w+))来捕获其中的单词。 第一组是(\w+[\s\.]+) 我用join再次重建连接组。

如果您想为此任务使用正则表达式,请查看以下内容:

(\w+)\s+(?=(\w+))

正则表达式演示

诀窍是对第二个单词使用积极的前瞻并在一个组中捕获它。 为了得到 output 结果对,组合第 1 组和第 2 组匹配的结果。

通常我不认为同一个 RegEx 允许重叠的搜索结果。 相反,您可能想要做的是找到中间空格并找到空格之前和之后的单词。

在这种情况下,您不需要使用正则表达式,您可以使用 split

st = "This is a random text"
sp = st.split()

result = [f"{w1} {w2}" for w1, w2 in zip(sp, sp[1:])]
print(result)

结果

['This is', 'is a', 'a random', 'random text']

编辑

对于大数据,您可以实现生成器。 像下面的伪代码

def get_pair_from_large_text():
    tail_of_last_chunk = ""
    while True
        chunk = get_string_chunk_from_source()
        if len(chunk)==0:
            yield f"{words[-2]} {words[-1]}"
            break
        chunk = tail_of_last_chunk[1] + chunk

        words = split(chunk)
        tail_of_last_chunk = words[-2], words[-1]

        for w1, w2 in zip(words[:-1], words[1:-1])
            yield f"{w1} {w2}"


但是你真的需要正则表达式吗? 你可以在没有正则表达式的情况下做到这一点

L1 = line.split(' ')
L2 = L1[1:].append(' ')
Result = [' '.join(a,b) for a,b in zip(L1,L2)]

使用正则表达式,但结果不正确

>>> pattern1 = re.compile(r"(\w+\s+\w+)")
>>> pattern2 = re.compile(r"(\s+\w+\s+\w+)")
>>> l1 = re.findall(pattern1, line)
>>> l2 =[x.strip() for x in re.findall(pattern2, line)]
>>> l1
['This is', 'a random']
>>> l2
['is a', 'random text']
>>> l1 + l2
['This is', 'a random', 'is a', 'random text']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM