正则表达式
正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。
下图提供了正则表达式的简介写法:
1. 通配符 ?与 *
- ? 通配符匹配文件名中的 0 个或 1 个字符;
-
- 通配符匹配零个或多个字符。
ps: 使用 * 字符代替 ? 字符扩大了找到的文件的数量。
2. ^ ,+ ,$与.
- ^为匹配输入字符串的开始位置。
-
- 的作用是将前面一个字符或一个子表达式重复一遍或者多遍。, [0-9]+匹配多个数字, [0-9] 匹配单个数字
- abc$匹配字母 abc 并以 abc 结尾,$ 为匹配输入字符串的结束位置。
- .字符在正则表达式代表着可以代表任何一个字符(包括它本身)
例:[1]+abc$就是匹配数字开头,abc结尾的字符串
var str = "123abc";
var patt1 = /^[0-9]+abc$/;
document.write(str.match(patt1));
例:
import re
key = r"ababbbbcadsdf"
p1 = r"ab+"
pattern1 = re.compile(p1)
print pattern1.findall(key)
输出结果为:
['ab', 'abbbb']
即:按顺序从左往右匹配,+是前面一个字符(b)匹配一次或者多次。
3. 匹配.本身~转义字符:
这个符号通常用来把特殊的符号转成普通的。
例:
import re
key = r"afiouwehrfuichuxiuhong@hit.edu.cnaskdjhfiosueh"
p1 = r"chuxiuhong@hit.edu.cn"
pattern1 = re.compile(p1)
print pattern1.findall(key)
findall返回的是所有符合要求的元素列表,包括仅有一个元素时,它还是给你返回的列表。
输出结果为:
['chuxiuhong@hit.edu.cn']
我们在.的前面加上了转义符,而是只匹配“.”的意思!
4. *跟在其他符号后面表达可以匹配到它0次或多次
例如:网页内遇到了链接,可能既有http://开头的,又有https://开头的,我们怎么处理?
import re
key = r"http://www.nsfbuhwe.com and https://www.auhfisna.com"
p1 = r"https*://"#看那个*!
pattern1 = re.compile(p1)
print pattern1.findall(key)
输出结果为:
['http://', 'https://']
5. []代表匹配里面的字符中的任意一个
例如:
import re
key = r"lalala<heLLo>hello</HellO>heiheihei"
p1 = r"<[Hh][Ee][Ll][Ll][Oo]>.+?</[Hh][Ee][Ll][Ll][Oo]>"
pattern1 = re.compile(p1)
print pattern1.findall(key)
输出结果为:
['<heLLo>hello</HellO>']
6. [^]代表除了内部包含的字符以外都能匹配
例:现在有cat,hat,mat,qat,想要匹配所有的:
则:
import re
key = r"mat cat hat qat"
p1 = r"[a-z]*at"
pattern1 = re.compile(p1)
print pattern1.findall(key)
输出结果为:
['mat', 'cat', 'hat', 'qat']
若上例重要匹配除qat以外的,则:
import re
key = r"mat cat hat qat"
p1 = r"[^q]at"#这代表除了p以外都匹配
pattern1 = re.compile(p1)
print pattern1.findall(key)
输出结果为:
['mat', 'cat', 'hat']
7. 贪婪模式
例:我想匹配到@后面一直到“.”之间的,在这里是china 即@china.
import re
key = r"sichuan@china.edu.cn"
p1 = r"@.+."
pattern1 = re.compile(p1)
print pattern1.findall(key)
但是结果却是这样:
['@china.edu.']
- 因为正则表达式默认是“贪婪”的,我们之前讲过,“+”代表是字符重复一次或多次。但是我们没有细说这个多次到底是多少次。所以它会尽可能“贪婪”地多给我们匹配字符,在这个例子里也就是匹配到最后一个“.”。
- 那么,怎么才能匹配到想要的结果呢? “?”是也
8. 只要在“+”后面加一个“?”就变成了懒惰模式,匹配尽可能少的。
import re
key = r"sichuan@china.edu.cn"
p1 = r"@.+?."#我想匹配到@后面一直到“.”之间的,在这里是hit
pattern1 = re.compile(p1)
print pattern1.findall(key)
此时输出结果为:
['@china.']
小结
先写到这里,后面在学习中遇到再补充进来。
0-9 ↩︎