import re
import json

# 第一种方法(很普遍的写法吧)
iphones = []
# with open('name.txt', 'r', encoding='utf-8')as f:
#     for i in f.readlines():
#         name, city, height, weight, iphone = i.split()
#         if iphone.startswith('1') and len(iphone) == 11:
#             iphones.append(iphone)
# print(iphones)

# 第二种方法(我只用了一行代码搞定)
f = open('name.txt', 'r', encoding='utf-8')
str_name = f.read()
result = re.findall("[0-9]{11}",str_name)
f.close()
print(result)

"""
re模块中匹配的语法
re.match 从头开始匹配 (只匹配开头的字符)
re.search 匹配包含(全局匹配,但只匹配到一个)
re.findall 把所有匹配到的字符放到以列表中的元素返回(全局匹配,匹配到所有的返回)
re.split 以匹配到的字符当做列表分隔符(全局匹配,用匹配到的字符做分隔符)
re.sub 匹配字符并替换
re.fullmatch 全部匹配
"""

# re.match
a = '135adasdasdsad123'
# print(re.match('[0-9]{3}', a))  # 定义一个匹配规则,要寻找的字符串,但只匹配开头

b = '1adasdasdsad123,13'
# re.search
# print(re.search('[0-9]{2}',b)) # 12 定义一个匹配规则,要寻找的字符串,全局匹配但是找到一个就返回后面的不再查找匹配

# re.findall
c = '12adasdasdsad123,13'
# print(re.findall('[0-9]{2}', c))  # ['12', '12', '13']定义一个匹配规则,要寻找的字符串,全局匹配将所有满足规则的放在一个列表中并返回

d = '12adasdasdsad123,13'
# print(re.split(',', d))  # ['12adasdasdsad123', '13']
# print(re.split('[0-9]{2}', d))  # ['', 'adasdasdsad', '3,', '']
# 再看下字符串的split分割
# print(d.split(',')) # ['12adasdasdsad123', '13'] 按照精准的字符进行分割两个效果是一样的
# print(d.split('12')) #  ['', 'adasdasdsad', '3,13'] 但是re.split可以写规则啊,字符串的split只能准确的字符

#  re.sub
e = '12adasdasdsad123,13'
# print(re.sub('12','33',e))#33adasdasdsad333,13
# print(re.sub('ad','你好啊,我不好',e,count=1)) # 只替换一次,默认是替换全部


# re.fullmatch
f = '12'
# print(re.fullmatch('12',f)) # 匹配的字符与字符串完全一致才可以

"""
.       默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
^       匹配字符开头,若指定flags MULTILINE,这种也可以匹配上
$       匹配字符结尾, 若指定flags MULTILINE 
*       匹配*号前的字符0次或多次, 
+       匹配前一个字符1次或多次,
?       匹配前一个字符1次或0次 
{m}     匹配前一个字符m次 
{m}{n}  匹配前一个字符最少m次,最多n次 
|       匹配|左或|右的字符
(...)   分组匹配
'\A'     只从字符开头开始匹配 ,re.search("\Aabc","alexabc") 是匹配不到的,相当于re.match('abc',"alexabc") 或^
'\Z'    匹配字符结尾,同$
'\d'    匹配数字0-9
'\D'    匹配非数字
'\w'    匹配[A-Za-z0-9]
'\W'    匹配非[A-Za-z0-9]
's'     匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
'(?P...)' 分组匹配 re.search("(?P[0-9]{4})(?P[0-9]{2})(?P[0-9]{4}
"""

# .
# print(re.search('.','abc')) # <re.Match object; span=(0, 1), match='a'>
# print(re.search('.','abc').group()) # a
# print(re.search('.','\nabc')) # <re.Match object; span=(1, 2), match='a'>

# ^
# print(re.search('^ab','abc'))  # <re.Match object; span=(0, 2), match='ab'>
# print(re.search('^ab','caaaabbbb')) #None 和re.match的作用是差不多的
# print(re.search('^[0-9]{2}[a-z]{1}','12c1d')) # <re.Match object; span=(0, 3), match='12c'> 0-9数字+0-9数字+a-z字母

# $
# print(re.search('45$','123456'))  # None
# print(re.search('45$','12345645'))

# ^ $
# print(re.search('^456$','456'))   #<re.Match object; span=(0, 3), match='456'> 以什么开头以什么结尾的
# print(re.search('^[0-9][a-z]$','1a')) #<re.Match object; span=(0, 2), match='1a'>
# print(re.search('^[0-9][a-z]$','1aaa')) #None

# *
# print(re.search('a*','aaa')) #<re.Match object; span=(0, 3), match='aaa'>
# print(re.search('[a-z]*[0-9]*','aaa45')) #<re.Match object; span=(0, 5), match='aaa45'> a-z出现多次,0-9出现多次


# +
# print(re.search('a+', 'aaa'))  # <re.Match object; span=(0, 3), match='aaa'>
# print(re.search('a+', 'bbb'))  # None

# ?
# print(re.search('a?', 'aaa'))  # <re.Match object; span=(0, 1), match='a'>
# print(re.search('a?', 'bbb'))  # <re.Match object; span=(0, 0), match=''>

# {m,n}
# print(re.search('a{3,5}', 'aaaaaaaa'))  # <re.Match object; span=(0, 5), match='aaaaa'>
# print(re.search('a{3,5}', 'aaaabaaaa'))  # <re.Match object; span=(0, 4), match='aaaa'>
# print(re.search('a{3,5}', 'aaabaaa'))  # <re.Match object; span=(0, 3), match='aaa'>
# print(re.search('a{3,5}', 'aabaa'))  # None

#|
# print(re.search('[0-9]|[a-z]','aaaa')) #<re.Match object; span=(0, 1), match='a'>
# print(re.search('[0-9]|[a-z]','1111')) #<re.Match object; span=(0, 1), match='1'>
# print(re.search('[0-9]|[a-z]','AAA')) #None


#()()()
print(re.search('([0-9])([a-z])','1aabbccdd11223344'))#<re.Match object; span=(0, 2), match='1a'>
s = '11022219900816XXXX'
ses = re.search('(?P<city>[0-9]{3})(?P<shiqu>[0-9]{3})(?P<year>[0-9]{4})(?P<month>[0-9]{2})(?P<day>[0-9]{2})',s)
print(ses.groupdict())




# print(re.findall('[0-9]{11}', str_name))  # findall是匹配到所有符合条件的,匹配的是数字,而且出现11位的数字,以列表形式返回

# '.'     默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
# a = re.search('.', '\n@aa')  # <re.Match object; span=(0, 1), match='@'>
# b = re.match('.', '\n@aa')  # None 从开头查找符合条件的返回,因为\n不符合所以返回none
# print(a)
# print(b)

data = """我始终!@@##¥%…………&alkjdfsb1234\n
566667是中国人woaldsfkjzlkcjxv123*())<>
"""

# 匹配所有汉字
print(re.findall('[\u4e00-\u9fa5]', data))

# 匹配所有单字符,英文,数字,特殊符号
print(re.findall('[\x00-\xff]', data))

# 匹配所有非单字符,入汉字和省略号
print(re.findall('[^\x00-\xff]', data))
posted on 2020-04-16 22:49  python我学的很菜  阅读(223)  评论(0编辑  收藏  举报