正则使用当中用到的一些笔记:
匹配base64url的代码:
a='/item/%E4%BA%92%E8%81%94%E7%BD%91'
import re
b=re.match("/item/(%[A-Za-z0-9]{2})+",a)
if b is not None:
print b.group()
结果:/item/%E4%BA%92%E8%81%94%E7%BD%91
匹配中文:
name='item/%E4%BA%92%你好E8%81%94%E7%BD%91'
name_=re.findall(u'[\u4e00-\u9fa5]+',unicode(name))
result = ''.join(name_)
print result
结果:你好
去掉所有空格、制表符、换行符:
filed=re.sub('\s','',fileds)
(.*?)含义:懒惰匹配
.是匹配除了\n的任意字符
*是匹配0次或多次前面出现的正则表达式
?是匹配之前字符的0个或者1个
(.*?)即匹配0个或者任意个不是\n的任意字符
a = '/item/%E4%BA%92%E8%81%94%E7%BD%91/item/'
b=re.match('/item/(.*?)/item/',a)
if b is not None:
print b.group()
结果:/item/%E4%BA%92%E8%81%94%E7%BD%91/item/
在使用django的时候,(?P=name)
Matches whatever text was matched by the earlier group named name.
下面就简单解释解释此含义。
1.首先,使用此(?P=name)之前,在正则表达式中,必须之前已经有了名为name的带命名的group了,即有了类似的(?P)了,才可以用这个(?P=name)去匹配之前的(?P)部分的值。
2.此(?p=name)只是用来匹配,即只能适用于:re.search,re.match,re.find,re.findall等用来查询,匹配的正则表达式中。
而如果用于re.sub等被替换的字符中时,则是\g,而不是(?P=name),这点,不要搞混淆了。
再用文字描述一下就是:
re.sub(“用来查询的正则表达式,如果想要匹配前面已经命名的组(?Pxxx)中的xxx,此处用(?P=name)”,而被替换的内容的正则表达式中,如果想要获取前面的已经命名的组(?Pxxx)中的xxx,则是用\g”,需要处理的字符串”.
import re
reNamedGroupTestStr = u'标签:<a href="/tag/情侣电话粥/">情侣电话粥</a>';
foundTagA = re.search(u'.+?<a href="/tag/(?P<tagName>.+?)/">(?P=tagName)</a>', reNamedGroupTestStr);
print "foundTagA=", foundTagA; # foundTagA= <_sre.SRE_Match object at 0x00876D60>
if (foundTagA):
namedGroupStr = foundTagA.group("tagName");
print "namedGroupStr=", namedGroupStr; # namedGroupStr= 情侣电话粥
group1Value = foundTagA.group(0);
print "Group(0): group1Value=", group1Value; # Group(1): group1Value= 情侣电话粥
substitutedStr = re.sub(u'.+?<a href="/tag/(?P<tagName>.+?)/">(?P=tagName)</a>', u'所捕获的tag值为:\g<tagName>',
reNamedGroupTestStr);
print "Original string=%s, after substituted=%s" % (reNamedGroupTestStr,
substitutedStr); # Original string=标签:<a href="/tag/情侣电话粥/">情侣电话粥</a>, after substituted=所捕获的tag值为:情侣电话粥
参考
http://blog.csdn.net/feixuedongji/article/details/46422361
https://www.crifan.com/detailed_explanation_about_python_regular_express_match_named_group/