gpt4 book ai didi

python - 正则表达式的字符串掩码和偏移量

转载 作者:太空宇宙 更新时间:2023-11-03 12:52:05 29 4
gpt4 key购买 nike

我有一个字符串,我尝试在该字符串上创建一个正则表达式掩码,在给定偏移量的情况下,该掩码将显示 N 个单词。假设我有以下字符串:

“敏捷的棕色狐狸跳过懒狗。”

我当时要显示3个字:

偏移量 0:“The quick, brown”
偏移量 1:“快,棕狐”
偏移量 2:“棕狐跳跃”
offset 3: “狐狸跳过”
offset 4: “跳过”
偏移量 5:“越过懒惰”
偏移量 6:“懒狗”。

我正在使用 Python,我一直在使用以下简单的正则表达式来检测 3 个单词:

>>> 重新导入
>>> s = "敏捷的棕色狐狸跳过懒狗。"
>>> re.search(r'(\w+\W*){3}', s).group()
'快速,棕色'

但我不知道如何使用一种掩码来显示接下来的 3 个单词而不是开头的单词。我需要保留标点符号。

最佳答案

前缀匹配选项

您可以通过使用可变前缀正则表达式来跳过第一个 offset 单词,并将单词三元组捕获到一个组中来完成这项工作。

所以像这样:

import re
s = "The quick, brown fox jumps over the lazy dog."

print re.search(r'(?:\w+\W*){0}((?:\w+\W*){3})', s).group(1)
# The quick, brown
print re.search(r'(?:\w+\W*){1}((?:\w+\W*){3})', s).group(1)
# quick, brown fox
print re.search(r'(?:\w+\W*){2}((?:\w+\W*){3})', s).group(1)
# brown fox jumps

让我们看一下模式:

 _"word"_      _"word"_
/ \ / \
(?:\w+\W*){2}((?:\w+\W*){3})
\_____________/
group 1

这就是它所说的:匹配 2 个词,然后捕获到第 1 组,匹配 3 个词。

(?:...) 结构用于对重复进行分组,但它们是非捕获的。

引用资料


关于“单词”模式的注意事项

应该说 \w+\W* 对于“单词”模式来说是一个糟糕的选择,如下例所示:

import re
s = "nothing"
print re.search(r'(\w+\W*){3}', s).group()
# nothing

没有 3 个单词,但正则表达式无论如何都能匹配,因为 \W* 允许空字符串匹配。

也许更好的模式是这样的:

\w+(?:\W+|$)

\w+ 后跟 \W+ 或字符串 $ 的结尾。


捕获先行选项

正如 Kobi 在评论中所建议的那样,此选项更简单,因为您只有一个静态模式。它使用 findall 来捕获所有匹配项 ( see on ideone.com ):

import re
s = "The quick, brown fox jumps over the lazy dog."

triplets = re.findall(r"\b(?=((?:\w+(?:\W+|$)){3}))", s)

print triplets
# ['The quick, brown ', 'quick, brown fox ', 'brown fox jumps ',
# 'fox jumps over ', 'jumps over the ', 'over the lazy ', 'the lazy dog.']

print triplets[3]
# fox jumps over

它的工作原理是它在零宽度单词边界 \b 上进行匹配,使用前瞻来捕获第 1 组中的 3 个“单词”。

    ______lookahead______
/ ___"word"__ \
/ / \ \
\b(?=((?:\w+(?:\W+|$)){3}))
\___________________/
group 1

引用资料

关于python - 正则表达式的字符串掩码和偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3275324/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com