python - 我可以编写一个匹配模式的正则表达式,并让该模式的一部分成为反向匹配吗?

标签 python regex

我想编写一个 RegEx 来从大文本中删除省略号。

我需要找到一系列两个或多个点,它们之间可能有空格,也可能没有。我正在使用的 RegEx 正在查找我不想删除的句号实例,因此我希望 RegEx 模式的一部分在后面跟有特定字符串时否定该模式。

我一直在使用这种模式:re.compile(r'\.[\.]*\.')

这个问题是文本中有一些合法的缩写被它捕获了。

以这段文字为例:

1. Here are ... some . . ellipses..
2. This. . .is ellipsis also.
3. Here is an abbreviation. .i.

在上面的例子中,我希望我的模式只找到 ..., 。 ...。 . . 在第 1 行和第 2 行中。我不希望它在第 3 行中找到任何内容,但是,它会找到 。 . 在里面。

我可以更新 RegEx 以排除模式,如果它们之前或之后是字母 i,如下所示:re.compile(r'[^i]\.[\. ]*\.'[^i]) 但随后该模式将找不到第 2 行中的省略号。

理想情况下,我能够否定模式中的整个子字符串,这样它就不会考虑 。 . 是省略号,如果它后面是 i. 或前面是 .i,但是,我还没有找到任何方法来做到这一点。可能吗?

最佳答案

使用消极的前瞻性和消极的回顾:

import re

text = """
1. Here are ... some . . ellipses..
2. This. . .is ellipsis also.
3. Here is an abbreviation. .i.
"""

pattern = re.compile(r'(?<!\.i)\.[ \.]*\.(?!i\.)')
print(pattern.findall(text))   # ['...', '. .', '..', '. . .']
print(pattern.sub('', text))

删除 . 后的文本序列:

1. Here are  some  ellipses
2. Thisis ellipsis also.
3. Here is an abbreviation. .i.

避免 . 后跟 i. 的序列,您必须包含另一个带有 i 的字符来处理这种情况:

     . . .is

关于python - 我可以编写一个匹配模式的正则表达式,并让该模式的一部分成为反向匹配吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58287016/

相关文章:

java - java中包含关系运算符的字符串分割

python - anaconda 和spyder 的新手。使用不同的 sys.executables

python - 为 Caffe2 创建图像 LMDB

python - 如何将字符串变量分配给数据框名称

python - 编写 Python 脚本以使用控制台命令执行

python - 在 Python 中使用字符串提取数据框中的最后一个数字

python - 正则表达式非贪婪或

javascript - 需要一个不关心输入的字符是否少于 6 个的正则表达式

python - socket.accept() 参数无效

javascript - 我如何创建 javascript 正则表达式来匹配 {{match}}