[英]Python regex findall matching all pairs of words
我需要使用正则表达式在字符串中按顺序列出每对单词,代码的相关部分是这样的:
for word in re.findall(r'\w+\b.*?\w+', text):
现在让我们以文本“这是一个随机文本”为例,我想要的是这样的列表:
['这是','是一个','一个随机','随机文本']
相反,我得到的是:
['这是','随机']
我怎样才能解决这个问题? 提前致谢。
您说单词由随机数量的空格和/或标点符号分隔,我为此使用了[\s\.]+
。
你在这里做错的是你正在消费第二个单词,你需要的是一个匹配第二个单词但不消费它的积极前瞻,所以下次它会匹配它。 因为你说这是一个巨大的文本,我认为使用finditer
比findall
更好,不同之处在于它返回一个生成器,该生成器产生与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.