python中的正则表达式中的 ""

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中的正则表达式中的 ""相关的知识,希望对你有一定的参考价值。

各位大佬,我在正则表达式中用(|)来筛选文本中的邮箱,返回的只是()内部的内容,如何让返回的结果是具体邮箱而不是数字,我寻思着是不是()的问题,因为()的作用是匹配封闭的正则表达式,然后另存为子组,我在外部加了个括号返回数据就变成了元组.代码如下:

Python中re.findall()函数是要求正则表达式在捕获第0组数据时,要在正则表达式上加小括号才能捕获.

也就是说如果你要获取整个正则表达式匹配的数据(你这里是电子邮箱地址),需要在正则表达式外面加小括号,

然后取第0捕获组的数据(你这里是[x[0] for x in zhengze]),

因为findall函数把每一个匹配的多个捕获组(就是你正则表达式中的小括号中)的数据放到一个元组里,所以要用for循环把第0捕获组的数据取出来.

具体程序改进如下

>>>zhengze=re.findall("([A-Za-z0-9]+@(163|qq|gmail)\\.com)",txt)

>>>[x[0] for x in zhengze]

结果就是你要的邮箱列表了.

参考技术A

你要的代码:

import re

emailStr = "abc123@163.com xxx 456def@qq.com yyy 789ghi@gmail.com"

allEmailList = re.findall("([a-zA-Z0-9]+@(?:163|qq|gmail)\\.com)", emailStr) # ['abc123@163.com', '456def@qq.com', '789ghi@gmail.com']

print(allEmailList)


中间过程的代码:

# allEmailList = re.findall("[a-zA-Z0-9]@(163|qq|gmail)\\.com", emailStr) # ['163', 'qq', 'gmail']

# allEmailList = re.findall("([a-zA-Z0-9]+@(163|qq|gmail)\\.com)", emailStr) # [('abc123@163.com', '163'), ('456def@qq.com', 'qq'), ('789ghi@gmail.com', 'gmail')]

# allEmailList = re.finditer("([a-zA-Z0-9]+@(163|qq|gmail)\\.com)", emailStr) # <callable_iterator object at 0x10f94abe0>

附录:

参考技术B (?:163|qq) 可以这样写,则只匹配而不产生分组

Python正则总结

re总结

限定符(就是控制重复次数)

? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等价于 {0,1}。
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,‘zo+‘ 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}‘ 不能匹配 "Bob" 中的 ‘o‘,但是能匹配 "food" 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,‘o{2,}‘ 不能匹配 "Bob" 中的 ‘o‘,但能匹配 "foooood" 中的所有 o。‘o{1,}‘ 等价于 ‘o+‘。‘o{0,}‘ 则等价于 ‘o*‘。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。‘o{0,1}‘ 等价于 ‘o?‘。请注意在逗号和两个数之间不能有空格。

定位符

^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 或 之后的位置匹配。
$ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 或 之前的位置匹配。
 匹配一个字边界,即字与空格间的位置。
B 非字边界匹配。

字符分类

d 0 到 9 的任何数字
D 除 0 到 9 的数字以外的任何字符
w 任何字母、数字或下划线字符(可以认为是匹配“单词”字符)
W 除字母、数字和下划线以外的任何字符
s 空格、制表符或换行符(可以认为是匹配“空白”字符)
S 除空格、制表符和换行符以外的任何字符

自己的字符分类

[]
[abc]匹配方括号内的任意字符(诸如 a、b 或 c)。
[^abc]匹配不在方括号内的任意字符。

Python中用法

search 和 match

import re

print("# 检验是否为大小写")
s1 = 'adkkdak'
s2 = 'abc123efg'

lowerRe = re.search('^[a-z]+$', s1)
if lowerRe:
    print(s1, "全为小写")
else:
    print(s1, "不全为小写")

lowerRe = re.match('[a-z]+$', s2)
if lowerRe:
    print(s2, "全为小写")
else:
    print(s2, "不全为小写")

究其因

  1. 正则表达式不是python的一部分,利用时需要引用re模块

  2. 匹配的形式为: re.search(正则表达式, 带匹配字串)或re.match(正则表达式, 带匹配字串)。两者区别在于后者默认以开始符(^)开始。因此,re.search(‘^[a-z]+$‘, s1) 等价于 re.match(‘[a-z]+$‘, s2)

  3. 如果匹配失败,则an = re.search(‘^[a-z]+$‘, s1)返回None

compile 和 findall

print("# 匹配数字")
s1 = "12aa123bb1234cc12345dd"
s = []
testRe = re.compile('d+')
for i in testRe.findall(s1):
    s.append(i)
print("s1 = ", s1)
print(" ".join(s))
  1. compile就是创建一个表达式对象,就是好调用些

  2. findall其实就会返回一个列表,所以用for i in 没毛病

  3. group。一般括号里的都会有group()
    例子:

    import re
    a = "123abc456"
    print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)   #123abc456,返回整体
    print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)   #123
    print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)   #abc
    print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)   #456

以上是关于python中的正则表达式中的 ""的主要内容,如果未能解决你的问题,请参考以下文章

理解 Java 中的正则表达式:split("\t") vs split("\\t") - 它们啥时候都可以工作,啥时候应该使用它们

js正则表达式语法

正则表达式在python中的运用0x01

Python中的正则表达式?

Python正则总结

python正则表达式re.findall(r"\b\w+\b", s)中的r是啥意思?