gpt4 book ai didi

Python 多个正则表达式替换

转载 作者:太空狗 更新时间:2023-10-30 03:06:16 26 4
gpt4 key购买 nike

我是一个 python 新手。我已经搜索了好几天,但只找到了一些我的构想。Windows 上的 Python 2.7(我选择 Python 是因为它是多平台的,并且结果可以在 Windows 上移植)。

我想制作一个脚本,在文件夹中搜索 *.txt UTF-8 文本文件,加载内容(一个接一个地加载),将非 ascii 字符更改为 html 实体,然后添加 html 标签在每行的开头和结尾,但有 2 个标签变体,一个用于文件的头部,一个用于文件的尾部,它们(头尾)由空行分隔。之后,所有结果都必须写入另一个文本文件,如 *.htm。视觉化:

unicode1.txt:

űnícődé text line1
űnícődé text line2
[empty line]
űnícődé text line3
űnícődé text line4

结果必须在 unicode1.htm 中:

<p class='aaa'>&#369;n&iacute;c&#337;d&eacute; text line1</p>
<p class='aaa'>&#369;n&iacute;c&#337;d&eacute; text line2</p>
[empty line]
<p class='bbb'>&#369;n&iacute;c&#337;d&eacute; text line3</p>
<p class='bbb'>&#369;n&iacute;c&#337;d&eacute; text line3</p>

我开始开发我的解决方案的核心,但我坚持了下来。查看脚本版本(为简单起见,我选择使用 xmlcharrefreplace 进行编码)。

V1:

import re, cgi, fileinput
file="_utf8.txt"
text=""
for line in fileinput.input(file, inplace=0):
line=cgi.escape(line.decode('utf8'),1).encode('ascii', 'xmlcharrefreplace')
line=re.sub(r"^", "<p>", line, 1)
text=text+re.sub(r"$", "</p>", line, 1)
print text

它奏效了,结果不错,但对于这个任务,我认为文件输入不是一种可用的方式。

V2:

import re, cgi, codecs
file="_utf8.txt"
text=""
f=codecs.open(file, encoding='utf-8')
for line in f:
line=cgi.escape(line,1).encode('ascii', 'xmlcharrefreplace')
line=re.sub(r"^", "<p>", line, 1)
text=text+re.sub(r"$", "</p>", line, 1)
f.close()
print text

它弄乱了结果,在行开始的结束标记替换了第一个字母,等等。

V3(尝试多行标志):

import re, cgi, codecs
file="_utf8.txt"
text=""
f=codecs.open(file, encoding='utf-8')
for line in f:
line=cgi.escape(line,1).encode('ascii', 'xmlcharrefreplace')
line=re.sub(r"^", "<p>", line, 1, flags=re.M)
text=text+re.sub(r"$", "</p>", line, 1, flags=re.M)
f.close()
print text

同样的结果。

V4(尝试了 1 个正则表达式而不是 2 个):

import re, cgi, codecs
file="_utf8.txt"
text=""
f=codecs.open(file, encoding='utf-8')
for line in f:
line=cgi.escape(line,1).encode('ascii', 'xmlcharrefreplace')
text=text+re.sub(r"^(.*)$", r"<p>\1</p>", line, 1)
f.close()
print text

同样的结果。请帮忙。

编辑:我刚刚用十六进制编辑器检查了结果文件,每个结束标记之前都有一个 x0D 字节!为什么?

Edit2:更改为更合乎逻辑的方法

text+=re.sub(r"^(.*)$", r"<p>\1</p>", line, 1)

Edit3:通过 hexeditor,我看到了结果困惑的原因:每个 CRLF 之前有额外的 CR (x0D) 字节。我找到了 CR 问题,是什么造成的:与 + 的连接

# -*- coding: utf-8 -*-
text=""
f=u"unicode text line1\r\n unicode text line2"
for line in f:
text+=line
print text

这导致:

unicode text line1\r\r\n unicode text line2

知道如何解决这个问题吗?

最佳答案

这里根本不需要正则表达式,只需要这样做:

with open('utf8.txt') as f:
class_name = 'aaa'
for line in f:
if line == '\n':
classname = 'bbb'
else:
# decode / convert line
line = '<p class="{0}">{1}</p>\n'.format(class_name, line.rstrip())
# write line to file

您得到的结果看起来不是由正则表达式引起的,因为它们看起来是正确的。问题很可能出在您进行编码/转换的行中。打印该行而不添加标签以查看它是否符合预期。

关于Python 多个正则表达式替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8961763/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com