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))