簡體   English   中英

Python多個正則表達式替換

[英]Python multiple regular expression replace

我是一個蟒蛇新手。 我一直在尋找,但發現我的觀念只有一點點。 Windows上的Python 2.7(我選擇了python,因為它是多平台,結果可以在Windows上移植)。

我想創建一個腳本,在文件夾中搜索* .txt UTF-8文本文件,加載內容(一個文件在彼此之后),將非ascii字符更改為html權限,然后在開始時添加html標記並且在每一行的末尾,但是標簽的兩個變體,一個用於文件的頭部,一個用於文件的尾部,其中(頭尾)由空行分隔。 之后,所有結果必須寫入另一個文本文件,如* .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

它工作得很好,但是對於這個任務來說,fileinput不是我認為可行的方式。

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

結果相同。 請幫忙。

編輯:我剛用hexeditor檢查結果文件,每個結束標記都有一個x0D字節! 為什么?

Edit2:更改為更合理的方法

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

編輯3:使用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

您獲得的結果看起來並不是由正則表達式引起的,因為它們似乎是正確的。 問題很可能出在您進行編碼/轉換的行中。 打印該行而不添加標記以查看它是否符合預期。

#!/usr/bin/env python
import cgi
import fileinput
import os
import shutil
import sys

def textfiles(rootdir, extensions=('.txt',)):
    for dirpath, dirs, files in os.walk(rootdir):
        for f in files:
            if f.lower().endswith(extensions):
               yield os.path.join(dirpath, f)

def htmlfiles(files):
    for f in files:
        root, _ = os.path.splitext(f)
        newf = root + '.html'
        shutil.copy2(f, newf)
        yield newf

for line in fileinput.input(htmlfiles(textfiles(sys.argv[1])), inplace=True):
    if fileinput.isfirstline():
       klass = 'aaa' # start head part
    line = cgi.escape(line.decode('utf-8').strip())
    line = line.encode('ascii', 'xmlcharrefreplace')
    if not line: # empty line
       klass = 'bbb' # start tail part
       print(line)
    else:
       print('<p class="%s">%s</p>' % (klass, line))

$ python txt2html.py c:\root\dir

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM