python正则表达式对字符串的查找匹配

作者:爱打羽毛球的小怪兽 时间:2022-02-21 12:39:50 

Python中的正则表达式要用到re模块,下面先介绍一下正则表达式需要用到的特殊字符和说明

常用的RegEx基础语法

语法说明
\d匹配一个数字字符
\D匹配一个非数字字符
\s匹配任何不可见字符(空格、制表符、换行符等)
\S匹配任何可见字符
\w匹配任何单词字符
\W匹配任何非单词字符
.匹配所有字符
^从字符串开头开始匹配,比如^\d表示以一个数字字符开头
$从字符串末尾开始匹配,比如\d$表示以一个数字字符结尾
*匹配前一个字符任意次
+匹配前一个字符一次或多次
?匹配前一个字符零次或一次
{m}匹配前一个字符m次
{m,n}匹配前一个字符最少m次最多n次
\转义字符
[]比如[a-z]表示匹配从a到z之间的所有字符串
|或,比如A|B表示匹配A或B
()精确匹配括号中指定的模式

常用的RegEx函数

函数说明
search从字符串中进行搜索,成功则返回匹配目标,失败则返回None
match从字符串开头进行匹配,成功则返回匹配目标,失败则返回None
fullmatch匹配整个字符串
split根据模式分割字符串
findall查找字符串中所有非重叠匹配
finditer类似于findall,但返回Python迭代器
sub用提供的字符串替代匹配模式

以下为部分示例:

对于split函数,我们在对字符串进行分割的时候可以直接调用split方法,再次不再进行

>>> import re#导入包
>>> a='xiaoming:wo jiao xiaoming,wo de dianhua shi +86-666666'
>>> print(re.search(pattern='\d+\W\d+',string=a))
<re.Match object; span=(45, 54), match='86-666666'>#此处输出的时一个match对象

>>> mp=re.search(pattern='\d+\W\d+',string=a)#查找电话号码
>>> print(mp.group())#使用group方法获取于指定模式相匹配的字符串
86-666666
>>> print(mp.start())#获取第一个匹配字符串的索引
45
>>> print(mp.end())#获取匹配字符串的
54
>>> print(mp.span())#获取索引范围
(45, 54)

>>> print(re.findall(pattern='\w+',string=a))
['xiaoming', 'wo', 'jiao', 'xiaoming', 'wo', 'de', 'dianhua', 'shi', '86', '666666']

>>> m_sub=re.sub(pattern='\w+:',string=a,repl='xiaohong:')#模式替代,使用repl传入的字符串替代匹配到的第一个字符串
>>> print(m_sub)
xiaohong:wo jiao xiaoming,wo de dianhua shi +86-6666

#编译模式
>>> p=re.compile('\d{6}')#预先设定好匹配的模式
>>> m1=p.search(a)#对预先设定好的模式调用查找
>>> print(m1.group())获取查找到的字符串
666666

不区分大小写匹配字符

#! /usr/bin/python3
import re
rebocop = re.compile(r'rebocop', re.I)
match = rebocop.search('ReboCop is part man, part machine, all cop.').group()
print(match)

管理复杂的正则表达式

如果您需要匹配的文本模式很简单,则正则表达式很好。但是匹配复杂的文本模式可能需要冗长,复杂的正则表达式。您可以通过告诉re.compile() 函数来缓解这种情况忽略正则表达式字符串中的空格和注释。可以通过将变量 re.VERBOSE 作为传递来启用此&ldquo;详细模式&rdquo; re.compile()的第二个参数。

#! /usr/bin/python3
import re

phoneRegex = re.compile(r'''(
   (\d{3}|\(\d{3}\))?   # area code
   (\s|-|\.)?           # separator
   \d{3}                # first 3 digits
   (\s|-|\.)            # separator
   \d{4}                # last 4 digits
   (\s*(ext|x|ext.)\s*\d{2,5})?   #extension
   )''', re.VERBOSE)

请注意前一个示例如何使用三引号语法(&rsquo;&rsquo;&rsquo;)创建一个多行字符串,以便您可以将正则表达式定义分布在多行上,使其更加清晰。正则表达式字符串中的注释规则与常规Python代码:#符号及其后的所有内容线被忽略。此外,正则表达式的多行字符串内的额外空格不被视为要匹配的文本模式的一部分。这使您可以组织正则表达式,以便更容易阅读。

从粘贴板的文字中提取邮箱和手机号码

#! /usr/bin/python3
# phoneAndEmail.py - Finds phone numbers and email address on the chipboard.

import pyperclip, re

americaPhoneRegex = re.compile(r'''(
   (\d{3}|\(\d{3}\))?   # area code
   (\s|-|\.)?           # separator
   (\d{3})              # first 3 digits
   (\s|-|\.)            # separator
   (\d{4})              # last 4 digits
   (\s*(ext|x|ext.)\s*(\d{2,5}))?   # extension
   )''', re.VERBOSE)    

chinesePhoneRegex = re.compile(r'1\d{10}')

emailPhoneRegex   = re.compile(r'''(
       [a-zA-Z0-9._%+-]+      # username
       @                      # @ symbol
       [a-zA-Z0-9.-]+         # domain name
       (\.[a-zA-Z]{2,4})      # dot-something
       )''', re.VERBOSE)

# Find matches in clipboard text.
text = str(pyperclip.paste())
matches = []
for groups in americaPhoneRegex.findall(text):
   phoneNum = '-'.join([groups[1], groups[3], groups[5]])
   if groups[8] != '':
       phoneNum += ' x' + groups[8]
   matches.append(phoneNum)

for groups in emailPhoneRegex.findall(text):
   matches.append(groups[0])

for groups in chinesePhoneRegex.findall(text):
   matches.append(groups[0])

# copy results the clipboard.
if len(matches) > 0:
   pyperclip.copy('\n'.join(matches))
   print('Copied to clipboard:')
   print('\n'.join(matches))
else:
   print('No phone numbers or email addresses found.')

来源:https://blog.csdn.net/qq_57099024/article/details/122231002

标签:Python,字符串,匹配
0
投稿

猜你喜欢

  • 怎么样用xmlhttp读取远程xml的数据

    2008-10-11 13:52:00
  • php中in_array函数用法探究

    2023-06-21 21:03:54
  • python中Requests发送json格式的post请求方法

    2021-05-24 10:09:45
  • asp fso type属性取得文件类型代码

    2009-02-04 10:09:00
  • PHP结构型模式之享元模式详解

    2023-05-27 22:38:40
  • asp+XMLHTTP的国际域名查询系统(whois)源代码

    2008-02-16 09:23:00
  • Python多进程之进程同步及通信详解

    2022-01-07 00:29:13
  • 新浪微博文字渐隐效果

    2011-04-29 12:33:00
  • 在Windows下安装配置CPU版的PyTorch的方法

    2023-07-18 15:04:17
  • django rest framework使用django-filter用法

    2023-03-06 01:56:06
  • php使用ZipArchive函数实现文件的压缩与解压缩

    2023-07-12 20:58:19
  • asp操作Excel类源码

    2009-12-25 19:01:00
  • Python机器学习NLP自然语言处理基本操作词袋模型

    2023-08-20 06:23:30
  • ASP编程入门进阶(十三):AdRotator & Content Rotator

    2008-09-24 17:47:00
  • 如何设计注册激活邮件

    2010-01-12 13:14:00
  • Python基于Django实现验证码登录功能

    2023-06-25 03:21:13
  • 在django中使用post方法时,需要增加csrftoken的例子

    2023-08-12 06:44:34
  • 修改SQL Server 2005 sa用户密码的方法

    2008-12-10 14:41:00
  • js自定义快捷,IE,FF有良好的支持

    2007-08-25 17:34:00
  • ASP常见数学函数 Abs Atn Cos 等详解

    2008-05-28 12:33:00
  • asp之家 网络编程 m.aspxhome.com