python学习进阶--1 字符串个文本

本文详细介绍Python中正则表达式的使用方法,包括字符串的拆分、匹配、搜索与替换等高级技巧,并演示如何处理Unicode文本及进行文本的标准化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基础的大概懂了,剩下的就是那些比较奇特的,有用的用法,这也是一本火热的进阶上一点一点学的,也有些年头了

# region 2.1 任意多分隔符拆分
# split只能处理简单的状况 使用re.split
import re
line = "dsk hfde;fdsd.gfde,ghte"
re.split(r"[;,.\s]", line)
re.split(r"(\.|;|,|\s)", line)    # 这种方法会捕获分隔符的
# 可是使用?:来解决这个问题
re.split(r"(?:\.|;|,|\s)", line)    # 这种方法会捕获分隔符的
# endregion

# region 2.2 在字符串开头和结尾做匹配
# 例如检查扩展名 URL协议类型等
# 简单的使用str.startwith和endwith就可以
filename = "apsm.txt"
filename.endswith("txt")
# 多条件检查
filenames = []
[name for name in filenames if name.endswith((".txt", ".exe"))]

# shell 通配符匹配 后者匹配大小写
from fnmatch import fnmatch, fnmatchcase
fnmatch("foo.txt", "*.txt")
fnmatch("foo45.txt", "f00[0-9]*.txt")
[name for name in filenames if fnmatch(name, "a*.txt")]

# endregion

# region 2.3 文本模式的匹配和查找
text = "wo are your friends"
text == "wo are"
text.startswith("wo")
text.find("your")  # 寻找索引序号

# 使用正则匹配
import re
text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
datepat = re.compile(r'(\d+)/(\d+)/(\d+)')  # 匹配日期
datepat.findall(text)
for month, day, year in datepat.findall(text):
    print("{ }-{ }-{ }".format(year, month, day))


# endregion

# region 2.4 字符串匹配和搜索
text = 'yeah, but no, but yeah, but no, but yeah'
text == 'yeah'
text.startswith('yeah')
text.endswith('no')
text.find('no')
# 复杂些的用正则匹配
text1 = '11/27/2012'
re.match(r'\d+/\d+/\d+', text1)

datepat = re.compile(r'\d+/\d+/\d+')  # 预先编译
datepat.match(text1)

text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
datepat.findall(text)
[('11', '27', '2012'), ('3', '13', '2013')]
for month, day, year in datepat.findall(text):
    print('{ }-{ }-{ }'.format(year, month, day))
# endregion

# region 2.5  字符串搜索和替换

text = 'yeah, but no, but yeah, but no, but yeah'
text.replace("year", "yep")

# 复杂的模式使用正则
text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text)  # 反斜杠数字比如 \3 指向前面模式的捕获组号。

# 更复杂的使用回调函数
from calendar import month_abbr
datepat = re.compile(r'(\d+)/(\d+)/(\d+)')
def change_date(m):
    newmonth = month_abbr[int(m.group(1))]  # 转换月份标示
    return "{ } { } { }".format(m.group(2), newmonth, m.group(3))
datepat.sub(change_date, text)
# endregion

# region 2.6 字符串忽略大小写的搜索替换
text = 'UPPER PYTHON, lower python, Mixed Python'
re.findall("python", text, flags=re.IGNORECASE)

# 替换有个问题 不会保持原大小写
re.sub('python', 'snake', text, flags=re.IGNORECASE)

def matchcase(word):
    def replace(m):
        text = m.group()
        if text.isupper():
            return word.upper()
        elif text.islower():
            return word.lower()
        elif text[0].isupper():
            return word.capitalize()
        else:
            return word
    return replace
re.sub('python', matchcase('snake'), text, flags=re.IGNORECASE)
# endregion

# region 2.7 最短匹配模式
# 贪婪模式与最小匹配
text2 = 'Computer says "no." Phone says "yes."'
strre = re.compile(r"""(.*)""")
strre.findall(text)
# ['no.' 'Phone says' 'yes.']

str_pat = re.compile(r'"(.*?)"')
str_pat.findall(text2)
# ['no.', 'yes.']
# endregion

# region 2.8 跨行匹配
# (.)去匹配任意字符的时候,忘记了点(.)不能匹配换行符
text1 = '/* this is a comment */'
text2 = '''/* this is a
... multiline comment */
... '''
commont = re.compile(r"/\*(.*)\*/")  # 匹配/*.....*/
commont.findall(text2)   # 结果为空
# 支持换行
comment = re.compile(r'/\*((?:.|\n)*?)\*/')
# endregion

# region 2.9 将Unicode文本标准化
# 而这表述方式不一样 但是是一个东西 也不会相等
s1 = 'Spicy Jalape\u00f1o'
s2 = 'Spicy Jalapen\u0303o'
# 可以先标准化 第一个参数指定字符串标准化的方式
import unicodedata
t1 = unicodedata.normalize("NFC", s1)
t2 = unicodedata.normalize("NFC", s1)
t1 == t2

# 去掉和音
t1 = unicodedata.normalize('NFD', s1)
''.join(c for c in t1 if not unicodedata.combining(c))
# 'Spicy Jalapeno'
# combaining函数可以测试一个字符是否为和音字符
# endregion

# region 2.10 在正则式中使用Unicode
import re
num = re.compile(r"d+")
num.match("123")
num.match('\u0661\u0662\u0663')
# endregion

# region 2.11 删除字符串中不需要的字符
# strip() 方法能用于删除开始或结尾的字符。 lstrip() 和 rstrip() 分别从左和从右执行删除操作。
# 默认情况下,这些方法会去除空白字符,但是你也可以指定其他字符
s = "  hello word \n"
s.strip()
t = "----hello====="
t.lstrip("-")
t.strip("-=")
# endregion

# region 2.12 审查清理文本字符串
# 除了上文的标准化 替换等 还可以用 str.translate() 方法
remap = {ord("\t"): " ", ord("\n"): " "}
text = "python\tis\ngood"
text.translate(remap)

# 输入的关键是构造字典
a = "pýtĥöñ is awesome\n"  # 特殊字符
import unicodedata
import sys
cmb_chrs = dict.fromkeys(c for c in range(sys.maxunicode) if unicodedata.combining(chr(c)))
b = unicodedata.normalize('NFD', a)
b.translate(cmb_chrs)
# dict.fromkeys() 方法构造一个字典,每个Unicode和音符作为键,对应的值全部为 None

# 下面的通过转换的方式
b = unicodedata.normalize('NFD', text)
b.encode('ascii', 'ignore').decode('ascii')
# endregion

# region 2.13 文字串对齐
# 基本的字符串对齐操作,可以使用字符串的 ljust() , rjust() 和 center() 方法 指定长度参数
text = "hello word"
text.ljust(20)
text.rjust(20)
# 这些方法都接受一个填充字符参数
text.rjust(20, "-")

# format() 同样可以用来很容易的对齐字符串 < > ^ 三种输入距离参数
format(text, '>20')
format(text, '=>20s')  # 指定填充方式

# 格式化输出时有用
'{:>10s} {:>10s}'.format('Hello', 'World')
x = 1.2345
format(x, "^10.2f")
# endregion

# region 2.14 合并字符串
# 最快的方法就是join方法
parts = ['Is', 'Chicago', 'Not', 'Chicago?']
" ".join(parts)
",".join(parts)

# 如果仅仅是几个的话 +就足够了
result = "i" + " " + "love you"

# 定义时候的源码拼接 可以不用加号
a = 'Hello' 'World'
# endregion

# region 2.15 字符串中插入变量
# 使用格式化字符串方法
s = '{name} has {num} messages.'
s.format(name="song", num="12")

# 如果需要的变量已经定义好了 可以使用format_map 和 var 方法
name = 'Guido'
num = 37
s.format_map(vars())

# 比较有意思的是 var支持类的实例 即变量是在对象实例中
class Info:
    def __init__(self, name, num):
        self.name = name
        self.num = num


a = Info("songyu", "31")
s.format_map(vars(a))

# 存在的问题是如果变量不存在 就会出现错误 添加一个missing函数在实例里就可以
class safesub(dict):
    def __missing__(self, key):
        return "{" + key + "}"
# 在引用该类的实例时就不怕没有变量引起错误了
# endregion

# region

# endregion
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值