我不會用這個正則表達式,因爲同樣的原因,我不會嘗試用熱核彈頭殺死蒼蠅。
假設你正在讀線的時間,只是:
- 如果第一個字符是一個
#
,設置爲全行註釋和空行。
- 否則,請在
\
之後找到#
的第一個匹配項,然後將註釋設置爲加上該行的其餘部分,並將該行設置爲之前的所有內容。
- 用
#
替換所有出現的\#
。
就是這樣,你現在有一個正確的線和評論部分。一定要用正則表達式來分割新的線段。
例如:
import re
def fn(line):
# Split line into non-comment and comment.
comment = ""
if line[0] == "#":
comment = line
line = ""
else:
idx = re.search (r"[^\\]#", line)
if idx != None:
comment = line[idx.start()+1:]
line = line[:idx.start()+1]
# Split non-comment into key and value.
idx = re.search (r"=", line)
if idx == None:
key = line
val = ""
else:
key = line[:idx.start()]
val = line[idx.start()+1:]
val = val.replace ("\\#", "#")
return (key.strip(),val.strip(),comment.strip())
print fn(r"someoption1 = some value # some comment")
print fn(r"# this line is only a comment")
print fn(r"someoption2 = some value with an escaped \# hash")
print fn(r"someoption3 = some value with a \# hash # some comment")
生產:
('someoption1', 'some value', '# some comment')
('', '', '# this line is only a comment')
('someoption2', 'some value with an escaped # hash', '')
('someoption3', 'some value with a # hash', '# some comment')
如果必須使用正則表達式(針對我的意見),您的具體問題就在這裏:
[^\#]
(假設您的意思是正確轉義的r"[^\\#]"
)將嘗試匹配除\
或#
之外的任何字符,而不是您想要的順序\#
。您可以使用排除查找屁股做到這一點,但我總是說,一旦正則表達式變得不可讀的白癡着急,最好恢復到程序代碼:-)
經過思考,一更好的方式來做到這一點是一個多層次的分裂(這樣的正則表達式沒有獲得通過處理丟失的領域太可怕),具體如下:
def fn(line):
line = line.strip() # remove spaces
first = re.split (r"\s*(?<!\\)#\s*", line, 1) # get non-comment/comment
if len(first) == 1: first.append ("") # ensure we have a comment
first[0] = first[0].replace("\\#","#") # unescape non-comment
second = re.split (r"\s*=\s*", first[0], 1) # get key and value
if len(second) == 1: second.append ("") # ensure we have a value
second.append (first[1]) # create 3-tuple
return second # and return it
它使用負前瞻正確匹配註釋分隔符將非註釋位分隔爲鍵和值。空格可以在這一個正確處理爲好,得到以下特性:
['someoption1', 'some value', 'some comment']
['', '', 'this line is only a comment']
['someoption2', 'some value with an escaped # hash', '']
['someoption3', 'some value with a # hash', 'some comment']
這個問題是關於正則表達式還是關於用Python解析配置文件?如果是後者,那你爲什麼要編寫一個配置文件解析器? Python的標準ConfigParser模塊(http://docs.python.org/library/configparser.html)應該可以做到! – 2010-09-24 01:41:34
只是專門詢問那個正則表達式。我只是想知道如何使用正則表達式來做到這一點。我意識到還有其他一些方法可以實現相同的目標,包括Python內置的configparser模塊。雖然謝謝! – apeace 2010-09-24 01:52:28
如果你不從頭開始提供不是無能的證據,回答者將承擔最壞的情況:-) – 2010-09-24 02:19:49