python re 模块。
在python docs中,这些内容基本都是成对出现的。但是基本是反义的意思。比如\w 和 \W,\d \D。主要是 \w 和 \W 这两个内容。首先是 \w,这个可以匹配[a-zA-Z_0-9] 这些内容。这些东西正好是组成变量名的元字符。所以我相匹配所有的合法的变量名,那么我可以用这个模式来匹配。 obj = re.compile('\w*'); 这样就可以找到一行代码中的所有的变量名了。然后再用 obj.findall('a+b+c+__c');基本上可以找出一个表达式中所有的变量名了。如果不是用re来完成,这样的任务应该也很麻烦。
* ? + . ^ $ 这几个符号都是很重要很基本的,首先他们是代表什么含义要明白。这些在python docs 中都又很详细的描述,?表示0个或多个,+表示1个或多个。.表示任何符号,^表示字符串的开头,$表示字符串的结尾。问号还可以表示是非贪婪匹配的意思。
targ = '3.23+4.42-16.8877*123'
ss = 'new2012,bay2013'
ob = re.compile('[a-z]*\d*\d')
好好想一下这些是怎么回事。我还是没有搞明白括号的用法。但是从下面这个例子可以说明一些问题。
在python docs中,这些内容基本都是成对出现的。但是基本是反义的意思。比如\w 和 \W,\d \D。主要是 \w 和 \W 这两个内容。首先是 \w,这个可以匹配[a-zA-Z_0-9] 这些内容。这些东西正好是组成变量名的元字符。所以我相匹配所有的合法的变量名,那么我可以用这个模式来匹配。 obj = re.compile('\w*'); 这样就可以找到一行代码中的所有的变量名了。然后再用 obj.findall('a+b+c+__c');基本上可以找出一个表达式中所有的变量名了。如果不是用re来完成,这样的任务应该也很麻烦。
* ? + . ^ $ 这几个符号都是很重要很基本的,首先他们是代表什么含义要明白。这些在python docs 中都又很详细的描述,?表示0个或多个,+表示1个或多个。.表示任何符号,^表示字符串的开头,$表示字符串的结尾。问号还可以表示是非贪婪匹配的意思。
targ = '3.23+4.42-16.8877*123'
ob = re.compile('\d+[\.]?\d+')
ob.findall(targ) 可以找出所有的数字。
我感觉 括号的实用还是很诡异的呀,所以不太好搞明白啊。
ob.findall(targ) 可以找出所有的数字。
ss = 'new2012,bay2013'
ob = re.compile('[a-z]*\d*\d')
好好想一下这些是怎么回事。我还是没有搞明白括号的用法。但是从下面这个例子可以说明一些问题。
text = "Professor Abdolmalek, please report your absences promptly."
re.findall(r"(\w)(\w+)(\w)", text)
def repl(m):
inner_word = list(m.group(2))
random.shuffle(inner_word)
return m.group(1) + "".join(inner_word) + m.group(3)
text = "Professor Abdolmalek, please report your absences promptly."
re.sub(r"(\w)(\w+)(\w)", repl, text)
'Pofsroser Aodlambelk, plasee reoprt yuor asnebces potlmrpy.'
下面这个可以找到字符串中长度为2 或 3 的字符串。并且我发现如果不加上r这个字符的话,是得不到正确结果的。r表示raw string 的意思。因为在里面用到了不少的字符,这些都是需要转义才可以正常匹配的,当然这样的话就非常麻烦,加上r之后,就可以避免这些麻烦的转义符了。
下面的例子是找出长度为 1 和长度 为2 的单词。结果就是 he 和 i。
ss = 'new2012,bay2013 he hehehe i sss'
ob = re.compile(r'\b[a-z]{1,2}\b')
基本上就是这样的,具体的可以再参考具体的文档。现在这个模块基本上比较熟悉了。下面的这个例子也比较经典。出了findall之外,finditer也是比较合理的。
text = "He was carefully disguised but captured quickly by police." for m in re.finditer(r"\w+ly", text): print '%02d-%02d'%(m.start(),m.end(),m.group(0))这样就可以找到所有的副词了。对于正则,总之需要多练习,才能在工作中比较熟练的使用。多看一些例子还是很有用的,就算是这些特殊字符。比如说 \n \t 之类的,通过正则消除掉没用的空行,这都是很容易做到的。