2010-11-09 130 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

相关问题