您的位置:首页 > 编程语言 > Python开发

字符串处理神器——Python Regular Expression

2018-01-26 09:44 393 查看
正则表达式是一个特殊的字符序列(也可以理解为匹配模式)

它可以帮助方便地检查文本是否与该模式匹配。

匹配的信息包括匹配的子串、分组和在本文中的索引等等。

在python中所有正则表达式的函数都在模块re中,有很多与字符串操作类似的函数。

放一些在ECNU Online Judge上能用re处理的例题(后续遇到了再更新~)

 1、EOJ 2897 英文缩写词

传送门:http://acm.ecnu.edu.cn/problem/2897/

除了预处理+stringstream的标准做法之外,使用re.split有奇效

import re
del_word = ["THE", "AN", "A", "OF", "FOR", "AND"]
while True:
try:
for word in re.split(r"[ -]", input().upper()):
if not (word in del_word):
print(word[0], end = '')
print('')
except:
break


2、EOJ 3124 英文缩写词

传送门:http://acm.ecnu.edu.cn/problem/3124/

 这题的大致思路是:用标点和空格分割字符,filter过滤后用set去重,最后排序

import re
cas = int(input())
for t in range(cas):
s = input()
print("case #%d:" %t)
lis = list(set(filter(lambda x: x, re.split(r'[,.!? ]+', s))))
lis.sort()
print(' '.join(lis))

 Tips:当输出要求各个数字/字符串用空格隔开时(有的还要求没有行末空格)

python的常规输出会很麻烦。

一个解决的办法是将存放输出结果的list转成str类型(lambda一下)

 然后像上面代码一样join输出。

 3、EOJ 3143 纯虚数的幂

传送门:http://acm.ecnu.edu.cn/problem/3143/

这题用python做直接解决了高精度问题,需要做的就是利用re.split将a和b提取出。

from re import split
cas = int(input())
for t in range(cas):
a, b = map(int, split(r"[j ]+", input()))
s = str(a ** b)
dic = {0: s, 1:s+'j', 2:'-'+s, 3:'-'+s+'j'}
print("case #%d:\n%s" %(t, dic[b%4]))


 4、EOJ 2959 正则表达式简化版

传送门:http://acm.ecnu.edu.cn/problem/2959/
题意就是给定一个模式串和若干文本串,问文本串是否和模式匹配。
上来用re直接search,WA了几发以后发现了问题所在:
python自带的正则表达式系统在文本串和模式串过长的情况下会抛出OverFlowError
当数据过大搜索持续的时候会RE(出题人硬要卡Python咯?)
所以可以改成一旦catch到Error就认为匹配失败就蜜汁AC了(雾)

from re import search
while True:
try:
s = input()
while True:
try:
text = input()
if text == '0': break
m = search(s, text)
print('Regular Expression is Fun!') if m else print('Boring String Matching...')
except OverflowError:
print('Boring String Matching...')
except:
break
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: