正则表达式,看我就懂

世界上分为两种人,一种是懂正则表达式的,一种是不懂正则表达式的。

不管你学的是什么语言,Java,iOS,安卓,都需要用到正则表达式,又因为正则表达式相通(每种语言几乎一样),所以在哪种语言学会正则,都可以用到其他语言中,下面我以python为例。

文末,有常用正则表达式

什么是正则表达式:

1、通俗理解:按照一定的规则,从某个字符串中匹配出想要的数据。这个规则就是正则表达式。
2、标准答案:https://baike.baidu.com/item/正则表达式/1700215?fr=aladdin

正则表达式常用匹配规则:

匹配某个字符串:

text = 'hello'
ret = re.match('he',text)
print(ret.group())
# he

点(.)匹配任意的字符

text = '+hello'
ret = re.match('.',text) # 只匹配一个任意字符,但不可以匹配换行(\n)符号
print(ret.group())
> +

\d匹配任意的数字:

text = "8"
ret = re.match('\d', text)
print(ret.group())
# 8

\D匹配任意的非数字:

text = "-"
ret = re.match('\D', text)
print(ret.group())
# -

\s匹配的是空白字符(包括:\n,\t,\r和空格):

text = "\t"
ret = re.match('\s',text)
print(ret.group())
\w: 匹配的是 a-z,A-Z,数字和下划线:
text = "b"
ret = re.match('\w',text)
print(ret.group())
# b

\W匹配的是和\w相反的:

text = "+"
ret = re.match('\W',text)
print(ret.group())
# +

[]组合的方式,只要满足中括号中的某一项都算匹配成功:

text = 'b'
ret = re.match('[a1b]',text)
print(ret.group())
# b

之前讲到的几种匹配规则,其实可以使用中括号的形式来进行替代:

  • \d:[0-9]
  • \D:[0-9]
  • \w:[0-9a-zA-Z_]
  • \W:[^0-9a-zA-Z_]

*:可以匹配0或者多个字符

text = "3a1bcd"
ret = re.match("\d*", text)
print(ret.group())
# 3

+:可以匹配1或者多个字符

text = "13ab6cd"
ret = re.match("\d+", text)
print(ret.group())
# 13

?:匹配一个或0个,要么没有,要么只有一个

text = "234"
ret = re.match("\w?", text)
print(ret.group())
# 2

{m}:匹配m个字符

text = "234ab"
ret = re.match("\d{2}", text)
print(ret.group())
# 23

{m,n}:匹配m-n个字符。在这中间的字符都可以匹配到

text = "2d34absds124"
ret = re.match("\w{1,4}", text)
print(ret.group())
# 2d34

search函数

text = "adX"
ret = re.search("d",text)
print(ret.group())
# d

^ (脱字号) :以什么开头,在macth函数中可以省略,效果一样,在 search 函数不可省略

text = "adX"
ret = re.match("^a",text)
print(ret.group())

$:表示以...结束:

text = "xxx@163.com"
ret = re.match("\w+@163.com$",text)
print(ret.group())
其他补充

search:在字符串中找满足条件的字符。如果找到,就返回。说白了,就是只会找到第一个满足条件的。

text = 'apple price $99 orange price $88'
ret = re.search('\d+',text)
print(ret.group())
# 99

text = "adX"
ret = re.search("d",text)
print(ret.group())
# d

$ 表示以什么结尾

text = "xxx@163.com"
ret = re.match("\w+@163.com$",text)
print(ret.group())
# xxx@163.com

|:匹配多个表达式或者字符串:

text = "hello|world|love"
ret = re.search('love',text)
print(ret.group())
# love

贪婪模式

text = "0123456"
ret = re.match('\d+',text)
print(ret.group())
# 0123456

可以改成非贪婪模式,那么就只会匹配到0

text = "0123456"
ret = re.match('\d+?',text)
print(ret.group())
# 0

匹配0-100之间的数字:

text = '99'
ret = re.match('[1-9]?\d$|100$',text)  # 记得有个 $ 结尾
print(ret.group())
# 99

转义字符和原生字符串:

1、 不用原生字符串,则需要4个 \ 因为 python中 "\n" = \n, 正则表达式中 "\n" = \n,所以 "\\m" => \n

 text = "apple \c"
 ret = re.search('\\\\c',text)
 print(ret.group())
# \c

2、原生字符串 r = raw = 原生的

text = "apple \c"
ret = re.search(r'\\c',text)  # 相当于这层pyhton不会将字符进行转义,只有正则表达式的转义,所以 =》 \c
print(ret.group())
# \c
小案例

1、验证手机号码:手机号码的规则是以1开头,第二位可以是34587,后面那9位就可以随意了

text = "18820898963"
ret = re.match("1[34578]\d{9}", text)
print(ret.group())

2、验证邮箱:邮箱的规则是邮箱名称是用数字、数字、下划线组成的,然后是@符号,后面就是域名了

text = "dwyane@163.com"
ret = re.match("\w+@[a-z0-9]+\.[a-z]+",text)
print(ret.group())

3、验证URL:URL的规则是前面是http或者https或者是ftp然后再加上一个冒号,再加上一个斜杠,再后面就是可以出现任意非空白字符了

text = "https://www.jianshu.com/u/bb2db3428fff"
ret = re.match("(http|https|ftp)://[^\s]+",text)   # [^\s] 非空白符
print(ret.group())

4、验证身份证:身份证的规则是,总共有18位,前面17位都是数字,后面一位可以是数字,也可以是小写的x,也可以是大写的X

text = "44010319900307883X"
ret = re.match("\d{17}[\dxX]",text)
print(ret.group())

5、验证用户名(用户名长度为6-20位之间,大小写字母或者数字均可)

text = "abCDf1245"
ret = re.match("^[A-Za-z0-9]{6,20}$",text)
print(ret.group())



更多精彩内容,请关注本人公众号 “bigdeveloper”——程序员大咖秀

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容