在模式之间替换字符

2024-09-26 18:02:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将文本文档拆分为两个新行字符:

# document example
field1: content asd..\n\nfield2: content qwe...\n\nfield3: content asfdqegt

但有时字段的内容中包含新行字符(请参见字段2):

field1: content asd..\n\nfield2: content\n\nqwe...\n\nfield3: content asfdqegt

因此,我不能使用\n\n作为分隔符


实际行为:

s = "field1: content asd..\n\nfield2: content\n\nqwe...\n\nfield3: content asfdqegt"
s.split("\n\n")
['field1: content asd..',
 'field2: content',
 'qwe...',
 'field3: content asfdqegt']

预期输出(需要替换field2:field3:之间的\n\n,而不是文档中的所有\n\n

s.split("\n\n")
['field1: content asd..', 'field2: contentqwe...', 'field3: content asfdqegt']

我的尝试:

import re
re.sub(r"(?<=field1: )(\n)(?<=field3: )", "", s) # does nothing
re.sub(r"\n", "", s) # replaces all \n, not just between field2 and field3

Tags: re文本文档content字符documentsplitfield2field1
3条回答

如果您的字段标识符始终为“fieldX”,您也可以使用它进行拆分:

>>> s.split('\n\nfield')
['field1: content asd..', '2: content\n\nqwe...', '3: content asfdqegt']

你可以用

import re
s = "field1: content asd..\n\nfield2: content\n\nqwe...\n\nfield3: content asfdqegt"
output = [x.replace('\n', '') for x in re.split(r"\n\n(?=\w+:)", s)]
print(output)
# => ['field1: content asd..', 'field2: contentqwe...', 'field3: content asfdqegt']

online demo。另见regex demo

\n\n(?=\w+:)模式匹配两个LF字符,紧接着是一个或多个单词字符,然后是一个:字符。使用此模式拆分字符串后,将使用.replace('\n', '')从每个块中删除任何LF char

您可以在字段之间进行匹配,并替换匹配中的换行符

^field\d+:.*(?:\n(?!field\d+:).*)*
  • ^字符串的开头
  • field\d+:.*匹配字段后跟1+位数,:和行的其余部分
  • (?:非捕获组作为一个整体重复
    • \n匹配换行符
    • (?!field\d+:)断言字符串不以字段模式开头
    • .*如果断言为true,则匹配整行
  • )*关闭该组并可选地重复

例如

import re

s = "field1: content asd..\n\nfield2: content\n\nqwe...\n\nfield3: content asfdqegt"
pattern = r"^field\d+:.*(?:\n(?!field\d+:).*)*"
res = [x.replace('\n', '') for x in re.findall(pattern, s, re.MULTILINE)]
print (res)

输出

['field1: content asd..', 'field2: contentqwe...', 'field3: content asfdqegt']

regex demoPython demo

相关问题 更多 >

    热门问题