python - 正则表达式替换除多次出现的组之外的任何内容
问题描述
我正在尝试找到一个合适的正则表达式来替换字符串中的任何内容,但要替换以某种模式开头的组。
假设我有这样的记录:
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 执行此操作。
解决方案
要检测单个字符串:
# 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
推荐阅读
- indexing - 如何在 xarray 中进行经纬度高级索引
- react-native - react native如何把这个类改成函数式组件
- powershell - 此特定 powershell 脚本的并行运行
- javascript - 仿射(松弛线性)类型的想法可以在无类型设置中实现以启用安全突变吗?
- postgresql - JOOQ 删除并加入
- redirect - 运行脚本时如何使用 OAuth2 进行身份验证?
- java - Intellij IDEA 中更简单的建议(无 `CTRL+Space` 和模糊搜索)
- python - Pygame.mouse.set_cursor((8,8),(0,0),(0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0 ,0)) 导致错误
- javascript - 通过循环向对象添加键出错
- swift - 访问 @Environment(\.presentationMode) 阻止 PDFView 出现