Python: Regular expressions

# encoding: utf-8
# 版权所有 2024 ©涂聚文有限公司
# 许可信息查看:
# 描述: 正则表达式用法
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 311
# Datetime  : 2024/4/28 10:37
# User      : geovindu
# Product   : PyCharm
# Project   : EssentialAlgorithms
# File      : RegularString.py
# explain   : 学习

import re
import os
import sys
import string

class DuString(object):
    """
    正则表达式用法
    """

    @staticmethod
    def strSplitUper(textSource: str, patterns: str) -> list:
        """
        分割字符串 第一个字母大写
        :param textSource:
        :param patterns:
        :return: list
        """
        ls = re.findall(r'[A-Z][a-z]*\S', textSource)
        return ls


    @staticmethod
    def strSplitLow(textSource: str, patterns: str) -> list:
        """
        分割字符串 第一个字母小写或大写
        :param textSource:
        :param patterns:
        :return: list
        """
        ls = re.findall(r'[A-Z][a-z]*|[a-z]*\S', textSource)
        return ls



    @staticmethod
    def strSplit(textSource: str, patterns: str)->list:
        """
        分割字符串
        :param textSource:
        :param patterns:
        :return: list
        """
        ls = re.split(r'[' + patterns + '\s]', textSource)
        return ls


    @staticmethod
    def strFunSplit(textSource: str)->list:
        """
        分割字符串 用字符串函数
        :return: list
        """
        ls = textSource.split(" ")
        return ls

    @staticmethod
    def strRegSplit(textSource: str)->list:
        """
        分割字符串
        :param textSource:
        :param patterns:
        :return: list
        """
        ls = re.findall(r"\S+", textSource)
        return ls

    @staticmethod
    def getdit(textSrource : str) -> list:
        """
        提取数字数据 静态方法
        所有数值
        数字提取:可以用正则表达式来提取数字,包括整数、浮点数等。
        "去商店买了8个苹果, 12斤香蕉, 共计12.85元."
        :return:
        """
        pattern = r'\d+\.\d+|\d+'
        match = re.findall(pattern, textSrource)
        if match:
            print(match)  # ['8', '12', '12.85']
        else:
            print("未找到数值")
        return match

    @staticmethod
    def getint(textSource:str) ->list:
        """
        提取整数
        :return:
        """

        # 匹配浮点数的正则表达式
        pattern = r'\d+'
        match = re.findall(pattern, textSource)
        if match:
            print(match)
        else:
            print("未找到数值")

        return match

    @staticmethod
    def getfloat(textSource:str) ->list:
        """
        提取浮点数
        :return:
        """
        # 匹配浮点数的正则表达式
        pattern = r"\d+\.\d+"

        match = re.search(pattern, textSource)
        if match:
            float_number = float(match.group())
            print(float_number)  #
        else:
            print("未找到数值")

        return match


    @staticmethod
    def getDate(textSource:str)->list:
        """
        提取日期
        处理逻辑:
            年 4位有效数值 \d{4}
            月 0-12   \d{1,2}
            日 0-31   \d{1,2}
        """
        dateText = ""
        if isinstance(textSource, str):
            regexRule = r"(\d{4}-\d{1,2}-\d{1,2})"
            regexPattern = re.compile(regexRule)
            dateList = regexPattern.findall(textSource)
            if dateList:
                dateText = dateList[0]
        return dateText


    @staticmethod
    def getTime(textSource:str)->list:
        """
        提取时间
        :param textSource:
        :return:
        """
        regexRule = r'(0?[0-9]|1[0-9]|2[0-3]):([0-5][0-9]|0?[0-9]):([1-5][0-9]|0?[0-9])'
        regexPattern = re.compile(regexRule)
        retList = regexPattern.findall(textSource)
        if retList:
            return retList
        else:
            print('没有匹配成功.')
        return None


    @staticmethod
    def getUrl(textSource:str)->list:
        """
        提取网址
        :param textSource:
        :return:
        """
        # 定义一个正则表达式模式来匹配URL
        pattern = r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+'
        # 使用re.findall()函数找到所有匹配的URL
        urls = re.findall(pattern, textSource)
        return urls

    @staticmethod
    def getMainIs(textSource:str)->bool:
        """
        是否有效的邮件
        :param textSource:
        :return:
        """
        pattern = r'^[\w\.-]+@[\w\.-]+\.\w+$'
        if re.match(pattern, textSource):
            print("有效的邮件地址")
            return True
        else:
            print("无效的邮件地址")
            return False


    @staticmethod
    def getIPIs(textSource:str)->bool:
        """
        是否有效的IP
        :param textSource:
        :return:
        """
        #定义IPv4地址的正则表达式
        ipv4Pattern = r'^((25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|[01]?\d{1,2})$'
        # 定义 IPv6 地址的正则表达式
        ipv6Pattern = r'^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$'
        if re.match(ipv4Pattern, textSource):
            print("IPv4 地址")
            return True
        elif re.match(ipv6Pattern, textSource):
            print("IPv6 地址")
            return True
        else:
            print("无效的 IP 地址")
            return False

    @staticmethod
    def getChinaMobileIs(textSource:str)->bool:
        """
        是否有效的国内手机号码
        :param textSource:
        :return:
        """
        # 匹配以1开头,第二位是3、4、5、6、7、8或9,后面有9位数字的手机号码。
        pattern = r'^1[3456789]\d{9}$'
        for number in textSource:
            if re.match(pattern, number):
                print(f'{number} 是有效的手机号码')
                return True
            else:
                print(f'{number} 不是有效的手机号码')
                return False

    @staticmethod
    def getPostCodeIs(textSource:str)->bool:
        """

        :param textSource:
        :return:
        """
        pattern = r'^\d{6}$'  # 匹配6位数字
        if re.match(pattern, textSource):
            print("邮政编码有效!")
            return True
        else:
            print("邮政编码无效!")
            return False


    @staticmethod
    def getICDIs(textSource:str)->bool:
        pattern = r'^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2]\d|3[0-1])\d{3}[0-9Xx]$'
        match = re.match(pattern, textSource)
        if match:
            print("身份证号码合法!")
            return True
        else:
            print("身份证号码不合法!")
            return False



    @staticmethod
    def extractHtmltags(textSource:str)->list:
        """

        :param textSource:
        :return:
        """
        pattern = r"<([^>]+)>"
        tags = re.findall(pattern, textSource)
        return tags


    @staticmethod
    def getStock(textSource:str)->list:
        """

        :param textSource:
        :return:
        """       
        # 提取公司简称
        companyNamePattern = r"[\u4e00-\u9fff]+"
        companyNameMatches = re.findall(companyNamePattern, textSource)
        companyCame = companyNameMatches if companyNameMatches else None
        # 提取证券代码 6位数
        stockCodePattern = r"\d{6}"
        stockCodeMatches = re.findall(stockCodePattern, textSource)
        stockCode = stockCodeMatches if stockCodeMatches else None
        print("公司简称:", companyCame) 
        print("证券代码:", stockCode)  
        return companyCame,stockCode




字符

含义

举例

备注

符合条件

.

一个任意字符

a..b

a开头b结尾,中间两个任意字符

a|2b

\w

一个字母/数字/下划线

\w...

字母/数字/下划线开头

o8js

\W

非字母/数字/下划线

\Wabc

#abc

\s

一个空白字符

a\sb

a\nb

\S

一个非空白字符

\S…

三个数字

2jkh

\d

数字字符

\d\d\d

675

\D

非数字字符

\D\w\w\w

#h7_

[]

括号中任意一个字符[1-9]数字1到9 [a-z]小写 [A-Z]大写

[abc]aaa

a/b/c开头

caaa

[^字符集]

一个不在字符集中的任意字符

[^abc]...

非a/b/c开头

898i

^

字符串开头

^\ddid

866

$

字符串结尾

abc$

abc

\b

(检测边界)

Abc\b\saaa

abclb\saaa

abc aaa

*

匹配≥0次

\d*

数字0或很多次

1个或很多个数字开

12312

+

匹配≥1次

\d+abc

1个或很多个数字开头

99abc

?

匹配0/1次

a?123

有a或者无a

a123

{N}

匹配N次

{M,N}

匹配M到N次

{M,}

至少匹配M次

{,N}

最多匹配N次

https://docs.python.org/zh-cn/3.11//howto/regex.htmll

match()和search()都只匹配出一个符合条件的字符串,若想要所有,可以使用re.findall() 

语法

释义

|

或者

()

  1. 组合(将括号中的内容作为一个整体进行操作)
  2. 捕获--使用带括号的正则表达式匹配成功后,只获取括号中的内容
  3. 重复--在正则表达式中可以通过\数字来重复前面()中匹配到的结果。数字代表前第几个分组

\

转义符号,在特殊的符号前加\,来让特殊的符号没有意义不管在哪儿都需要转义

-在口外面没有特殊功能,在口中要表示-本身,就不要放在两个字符之间()需要转义

compile

将正则表达式字符串转换成正则表达式对象

fullmatch/match

匹配对象或者None

string

获取被匹配的原字符串

findall

获取字符串中满足正则表达式的所有的子串,返回一个列表

finditer

查找所有满足正则条件的子串,返回值是迭代器,迭代器中的元素是匹配对象

split

将字符串按照满足正则表达式条件的子串进行分割

sub(正则,repl,字符串)

字符串中满足正则表达式条件的子串替换成repl。返回替换后的字符串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值