仅当符号 next/prior 对应 python 中的单词时才删除符号

removing symbol only when they are next/prior to a word in python

我想删除单词中的冒号 (:) next/prior,但不删除数字中的冒号 next/prior(例如,及时)。意思是,我不希望及时删除冒号,只删除与单词相关的冒号。

示例输入:

2018-05-21T00:00:00+02:00
00:00:00
00:00
:light at 07:15:0000

:occurence1
:occurence2

light: at 07:15:0000

occurence1:
occurence2:

预期输出:(删除单词的冒号 next/prior)

2018-05-21T00:00:00+02:00
00:00:00
00:00
light at 07:15:0000

occurence1
occurence2

light at 07:15:0000

occurence1
occurence2

我可以用正则表达式模式匹配它们:([A-Za-z_]\w*:|:[A-Za-z_]\w*)。但无法删除冒号 re.sub().

如何使用 python3.8 with/without 正则表达式执行此操作?

在这部分[A-Za-z_]\w*:中,\w也匹配数字导致匹配过多。在第二种模式中,您可以省略末尾的 \w*,因为它是可选的,在替换中不是必需的。

您还匹配了整个部分,而不是没有 : 的部分,并且使用带有 re.sub 的整个部分将导致删除匹配的所有内容。

您可以使用 2 个单独的组,其中第一个组可以捕获可选数字,匹配 : 而后跟一个数字并在替换中使用这些组。

([A-Za-z_]\d*):(?!\d)|:([A-Za-z_])

Regex demo

import re

regex = r"([A-Za-z_]\d*):(?!\d)|:([A-Za-z_])"

s = ("2018-05-21T00:00:00+02:00\n"
     "00:00:00\n"
     "00:00\n"
     ":light at 07:15:0000\n\n"
     ":occurence1\n"
     ":occurence2\n\n"
     "light: at 07:15:0000\n\n"
     "occurence1:\n"
     "occurence2:")

result = re.sub(regex, r"", s)

if result:
    print (result)

输出

2018-05-21T00:00:00+02:00
00:00:00
00:00
light at 07:15:0000

occurence1
occurence2

light at 07:15:0000

occurence1
occurence2

由 Wiktor Stribiżew 评论的环视变体,带有额外的交替断言左侧有数字而右侧没有数字。

(?<=[A-Za-z]):|:(?=[A-Za-z])|(?<=\d):(?!\d)

Regex demo