Python正则表达式预测非ASCII字符

时间:2012-12-04 00:09:37

标签: python regex lookahead

我把这个正则表达式的大部分都放下了,但是我在前瞻方面遇到了麻烦。我想将一个字符串分成一个邮政编码,然后是两个字符串或两个数字。数字可以是以下形式:

1
1.5
1.55
11.55

中间位的文本可以是“No minimum”,第三位的文本只能是“Free”。

E.g。

  

“YO1£10Free”==> YO1; 10;免

  

“yo1£8££0.5”==> YO1; 8; 0.5

  

“yo1No最低£0.75”==> YO1;没有最低限度0.75

我已经完成了第一步:

string = "YO1£ 10Free"
patternPostCode = re.compile("[a-zA-Z]{1,2}[0-9][a-zA-Z0-9]?")
postCode = re.findall(string,patternPostCode)

字符串中的数字可通过以下方式找到:

patternCost = re.compile(r"(?<=\xa3 )([0-9]|  
[0-9][0-9]|  
[0-9]?[0-9]?.[0-9]|
[0-9]?[0-9]?.[0-9][0-9])")

我很难在patternCost搜索中添加'或text等于“No minimum”'。我也无法包括前瞻。最后添加它不起作用:

(?<=\xc2)

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

我在Python 2.7上提出了这个问题:

# -*- coding: utf-8 -*-
import re

raw_string = "YO1£ 10.01Free"
string = raw_string.decode('utf-8')
patternPostCode = re.compile(u"^(\w{3}.*)\s+(\d+\.?\d*)(\w+)$",flags=re.UNICODE)
postCode = patternPostCode.findall(string)

print postCode
print u'; '.join(postCode[0])

返回:

[(u'YO1\xc2\xa3', u'10.01', u'Free')]
YO1£; 10.01; Free

首先,我从SO复制的原始字符串似乎是一个字节串,我不得不将其解码为unicode(参见byte string vs. unicode string. Python)。我认为你可能会遇到unicode编码错误 - 符号是一个经典的标志。

然后我使用re.UNICODE标志使你的正则表达式对unicode友好。这意味着您可以使用\ w表示“字母数字”,并使用\ n来表示“数字”,这是以unicode友好的方式。

http://docs.python.org/2/library/re.html#module-re

由于正则表达式经常被误认为是线路噪音,所以lemme解压缩:

u"^(\w{3}.*)\s+(\d+\.?\d*)(\w+)$"
  • ^ =行开头
  • (\ w {3}。*)=恰好匹配三个字母数字字符(\ w {3}),后跟任何(。*)和分组(这是整个事物的括号)。我不喜欢。*一般,但有必要抓住££垃圾。如果您不想要它,请将其移到括号外。
  • \ s + - 至少一个空格。我们会扔掉它
  • (\ d +。?\ d *) - 匹配一个或多个数字,后跟可选的句点,后跟可选的一个或多个数字。这将匹配10,10,10.0,10.0000等。
  • (\ w +) - 一个或多个字母数字字符
  • $ - 匹配行尾

这肯定不是我写过的最漂亮的正则表达式,但希望它足以让你开始。