首页 > 解决方案 > 正则表达式替换除多次出现的组之外的任何内容

问题描述

我正在尝试找到一个合适的正则表达式来替换字符串中的任何内容,但要替换以某种模式开头的组。

假设我有这样的记录:

Lorem ipsum dolor sit amet, consetetur sadipscing elitr. Lorem ipsum duo dolores, tempor et ea rebum.
L. i. sed diam; duo dolores. Lorem ipsum tempor et ea. Duo dolores
L.i. nonumy eirmod tempor et ea rebum. L. i. consetetur sadipscing.

我想替换字符串中的任何内容,但前面是 lorem ipsum 的变体。我希望得到以下结果:

dolor sit amet; duo dolores
sed diam; tempor et ea
nonumy eirmod tempor et ea rebum; consetetur sadipscing

我尝试了以下代码来捕获该组,但无法捕获该组的第二次出现。

'.*((Lorem ipsum)|(L\. *i\.)) ([0-9A-Za-z]+)+.*','\4; '

我怀疑这与第二个.*原因有关。我正在尝试在 Oracle 11g 中执行此操作,但不反对使用 Python 执行此操作。

标签: pythonregexoracle

解决方案


要检测单个字符串:

# Regex Pattern
pattern = r'(?:(Lorem ipsum )|(L\.\s?i\. ))(.*?)(?=[^\w\s])'

# Find matching string
result = [m[2] for m in re.findall(pattern, s, re.I)]

# Pattern matches
print('\n'.join(result))

print('\nFormatted into pairs')

# Display as pairs
#    Group into pairs
m = ['; '.join([result[i], result[i+1]]) for i in range(0, len(result), 2)]

#    Print Pairs
print('\n'.join(m))

输出

匹配模式

dolor sit amet
duo dolores
sed diam
tempor et ea
nonumy eirmod tempor et ea rebum
consetetur sadipscing

格式化成对

dolor sit amet; duo dolores
sed diam; tempor et ea
nonumy eirmod tempor et ea rebum; consetetur sadipscing

解释

使用模式:

pattern = r'(?:(Lorem ipsum )|(L\.\s?i\. ))(.*?)(?=[^\w\s])'

(?:(Lorem ipsum )|(L\.\s?i\. )) - non capturing group for variants of Loren ipsum
(.*?) - 'non-greedy' match any characters
(?=[^\w\s]) - lookahead to stop on non-word or space character

推荐阅读