pyparsing这个库简单来说是简化了正则的使用,可以更“人性”的理解和使用正则。其使用教程在这里 以及这里
pyparsing里主要是写函数的应用,这里主要介绍几个常用的
单词匹配 Literal 和 Word
匹配单词, 例子如下
str='hello world!'
pattern=Literal ('hello') # 或者Word ('hello')
try:
result = pattern.parseString(str)
print result
except ParseException as pe:
print " No match: {0}".format(str(pe))
结果如下:
Literal 和Word基本功能一致,都是匹配单词。
区别在于,
- Literal是匹配完整单词,意味着要有空格分隔;而Word不需要匹配上开始就可以。
- Literal匹配是按单词匹配;而Word匹配只要匹配到Word里的字符集合即可。
- Literal功能较为单一,而Word功能更丰富一些。 Word具体介绍看这里
常用标识 nums,alphas,alphasnums, hexnums, alphas8bit, punc8bit, printables
- nums
表示数字 - alphas
表示字母
上面的例子可以使用pattern=Word(alphas)
来替代 - alphasnums
表示数字和字母 - hexnums
表示十六进制 - alphas8bit
表示ASCII编码的字母 - punc8bit
表示ASCII编码的非字母 - printables
表示非空字符的其他任何字符
nums使用例子如下
text='1+2=3'
integer = Word(nums) # simple unsigned integer
try:
result1 = integer.parseString(text)
print result1
except ParseException as pe:
print " No match: {0}".format(str(pe))
结果如下
但是如果text的第一个字母不是数字的话就会抛出异常,说明这里的解析是“匹配”而不是“查找”
匹配(parseString)与查找(scanString)
上面的例子改一下,如果首字母不是数字,那么如何查找出所有的数字呢?
text='a1+2=3'
integer = Word(nums) # simple unsigned integer
try:
for tokens, start,end in integer.scanString(text):
print tokens, start, end
except ParseException as pe:
print " No match: {0}".format(str(pe))
结果如下
排除大小写敏感 CaselessLiteral
这个不难理解
str='HELLO WORLD!'
pattern=CaselessLiteral('hello')
try:
result = pattern.parseString(str)
print result
except ParseException as pe:
print " No match: {0}".format(str(pe))
排除匹配CharsNotIn
CharsNotIn是设置了一个合集,然后从左向右匹配字符串中不包含这个合集的子集。
text='hello world!'
pattern=CharsNotIn('abc')
try:
result = pattern.parseString(text)
print result
except ParseException as pe:
print " No match: {0}".format(str(pe))
下面例子中的合集为‘abc’,匹配中的单词不包含这三个字母,如果全匹配
text='hello world!'
pattern=CharsNotIn('uvwxyz')
try:
result = pattern.parseString(text)
print result
except ParseException as pe:
print " No match: {0}".format(str(pe))
由于'hello world!'中包含w,所以要从这里截断