2012-07-30 76 views
2

我想在python中編寫正則表達式,其中涉及的字符之一是\ 001字符。把\ 001放在一個字符串中似乎不起作用。我也嘗試過'string'+ str(chr(1)),但是正則表達式似乎沒有捕獲它。請爲了上帝的愛而有人幫助我,我一整天都在爲此而苦苦掙扎。如何在python字符串中放置字符文字

import sys 
import postgresql 
import re 

if len(sys.argv) != 2: 
    print("usage: FixToDb <fix log file>") 
else: 
    f = open(sys.argv[1], 'r') 
    timeExp = re.compile(r'(\d{2}):(\d{2}):(\d{2})\.(\d{6}) (\S)') 
    tagExp = re.compile('(\\d+)=(\\S*)\001') 
    for line in f: 
     #parse the time 
     m = timeExp.match(line) 
     print(m.group(1) + ':' + m.group(2) + ':' + m.group(3) + '.' + m.group(4) + ' ' + m.group(5)); 
     tagPairs = re.findall('\\d+=\\S*\001', line) 
     for t in tagPairs: 
      tagPairMatch = tagExp.match(t) 
      print ("tag = " + tagPairMatch.group(1) + ", value = " + tagPairMatch.group(2)) 

下面是輸入示例行。爲了便於閱讀,我用'〜'替換了'\ 001'字符

15:32:36.357227 R 1 0 0 0 8 = FIX.4.2〜9 = 0067〜35 = A〜52 = 20120713-19:32 :36〜34 = 1〜49 = PD〜56 = P〜98 = 0〜108 = 30〜10 = 134

輸出:

15:32:36.357227ř 標籤= 8,值= FIX .4.29 = 006735 = A52 = 20120713-19:32:3634 = 149 = PD56 = P98 = 0108 = 3010 = 134

因此它不會停在'\ 001'字符處。

+1

你應該使用重的 「原始」 的字符串.. 。 – 2012-07-30 18:42:08

+0

在'timeExp'中,在一組圓括號中捕獲整個時間表達式是不是更容易,所以您不必重新構建時間表達式('print(m.group(1)+':'.. .')? – 2012-07-30 18:49:38

+0

@Jon Clements:我認爲Alex沒有使用原始字符串,因爲他想將字符串文字包含在他的模式中。@Alex,如果要避免使用原始字符串以便在模式中使用字符串文字,反斜槓應該是加倍(''\\'')。 – 2012-07-30 18:50:16

回答

3

chr(1)應該可以工作,"\x01"也可以,"\001"也可以。 (注意:chr(1)已經返回一個字符串,所以你不需要做str(chr(1))。)在你的榜樣,它看起來像你有"\001"chr(1),所以除非你有兩個字符,將無法正常工作在你的數據中連續。

你說這個正則表達式「似乎沒有抓住它」,但是你沒有給出你的輸入數據的例子,所以不可能說明原因。

編輯;好的,看起來問題與\001無關。這是經典的貪婪問題。該\S*在tagExp表達式匹配\001字符(因爲字符不是空格所以\S*被吞噬了整條生產線使用\S*?,使其非貪婪

編輯:。正如其他人所指出的,這也看起來你的反斜槓是錯誤的,在正則表達式中,你會遇到一個反斜槓問題:Python使用反斜槓作爲自己的字符串轉義符(如\t用於換行符,\n用於換行符),但正則表達式也使用反斜槓來達到自己的目的例如,\s爲空格)。通常的解決方案是使用原始字符串,但如果您想使用"\001"轉義,則不能這樣做。但是,您可以使用timeExp正則表達式的原始字符串。在你的其他正則表達式中,加上反斜槓(\001除外,因爲你希望那個被解釋爲字符碼轉義)。

+0

對不起,我不是故意同時具有\ 001和str(chr(1)),這是帖子中的拼寫錯誤。我在那裏舉了一個例子,它都是一條線。 – Alex 2012-07-30 18:53:09

+0

@Alex:查看我編輯的答案。這個問題與'\ 001'無關,這是因爲'\ S *'表達式的貪婪匹配在到達'\ 001'之前佔用整行。 – BrenBarn 2012-07-30 19:19:49

+0

好吧,我刪除了雙反斜線並添加了'?' \ S *之後,它似乎工作正常。非常感謝,我非常感謝! – Alex 2012-07-30 19:24:19

1

而不是使用\S相匹配的值,它可以是任何非空白字符,包括\001的,你應該使用[^\x01],這將匹配不\001任何字符。

+0

這也可以,謝謝! – Alex 2012-07-30 19:26:02

0

@Sam Mussmann酒店不......

1(十進制)=\001(八)<>\x01(UNICODE)

相關問題