2010-11-09 95 views
0

我有一千行記錄的數據,我逐行閱讀。每行有一些字段和它們的值,但字段名稱包含一個非ASCII字符,以下是這樣的記錄的例子:正則表達式找出python中非ascii字符的字段

|    | | X:720      | N°227: Done 

,其中X和N°(非ASCII字符)是字段名和720227和「完成「是我必須提取的字段值。 這些字段是可選的,可能存在或可能不存在。 現在我必須檢查這些字段是否存在於行中,如果存在,那麼它的值是什麼(例如X字段的值是720,N°的值是227,「完成」) 請讓我知道在python中使用正則表達式來做到這一點,是否有任何其他方式在Python中做到這一點?

+0

你需要認真返修你的問題。標點和語法使其在很大程度上難以理解。 – 2010-11-09 08:26:32

+0

爲您的問題添加更多與輸入和期望輸出相關的示例。 – 2010-11-09 17:49:56

回答

0

有時候正則表達式對於這樣的事情有好處,有時split()和其他字符串方法會更容易。它是由你來選擇:

#!/usr/bin/env python 
# -*- coding: utf8 -*- 

import re 
RE_TXT = re.compile(r'\|\s*X:(\S+)\s*\|\s*N\D*(\d+):\s*(.*)$') 
txt = '|    | | X:720      | N°227: Done' 
rx = RE_TXT.search(txt) 
if rx: 
    print(rx.group(1)) 
    print(rx.group(2)) 
    print(rx.group(3)) 

print('-' * 20) 

# other way without regex, but with more complicated logic: 
arr = [s.strip() for s in txt.split('|')] 
if arr[3].startswith('X:'): 
    print(arr[3].split(':')[1]) 
    N, state = arr[4].split(':') 
    N = N[3:] 
    state = state.strip() 
    print(N) 
    print(state) 

至於正則表達式:

  • \s*是零個或多個白色字符
  • \S+是一個或多個非空白字符
  • \d是數字
  • \D用於非數字
  • .指任何字符串之前
  • r的意思是「原始」的字符串,所以你不需要逃避反斜槓
+0

RE_TXT = re.compile(r「\ s *(?:(X)\ s *:\ s *(\ d +))?\ s * \ | \ s *(?:(N \ D *(\ d + )\ s *:\ s *(。*)))「) – james 2010-11-09 10:37:40

+0

我已經使用上面的正則表達式來驗證字段是否存在,如果存在,那麼它的值是什麼,但它工作正常,如果兩個字段都存在,並且如果X字段丟失,但對於N°字段丟失情況,則失敗,問題出在哪裏? – james 2010-11-09 10:42:39

+0

如果您將在各種條件下構建更多邏輯,請使用非正則表達式解決方案。正則表達式適用於所有解決方案或沒有解決方案,但更復雜,可能非常神祕可能會起作用。也許添加更多的例子與輸入和所需的輸出到你的問題。 – 2010-11-09 12:00:17

相關問題