本文仅个人学习总结。
一、常用正则
方法:替换
foo_rep_g=re.sub(r'g,|g,|g |g',"$",foo)
#把foo中指定的字符换成空
普通字符查找替换
foo_drop_none=re.sub(r' ',"",foo_rep_g) #去除所有空格
foo_drop_kuohao=re.sub(u"\\(.*?\\)|\\(.*?\\)|\\(.*?\\)|\\(.*?\\)|\\{.*?}|\\[.*?]", "", foo_drop_none) #去除括号里的(中英文版混合
foo_drop_numbers=re.sub(r'[0-9]',"",foo_drop_kuohao)
#去除数字
foo_drop_chufang=re.sub(r'.*:|.*:|.*。',"",foo_drop_numbers) #冒号,句号前面的都去掉
去掉指定字符前面/后面的全部内容
foo_drop_chufang=re.sub(r'.*:|.*:|.*。',"",foo_drop_numbers) #冒号,句号前面的都去掉
foo_drop_chufang=re.sub(r':.*|:.*|。.*',"",foo_drop_numbers) #冒号,句号后面的都去掉
二、python中使用正则表达式
//主函数调用
data.dropna() #去NAN
for foo in data['组成']:
print(eliminate_sth(foo))
#每一行若干药,只保留药名和分隔符(逗号,或其他符号),最后分割
#先清洗药名,药名里去除括号等不需要的信息
#把一整条处方用分隔符分割
#一个个加到列表中,不需要的数据直接筛去
def eliminate_sth(foo):
answer = []
drop_kuohao = re.sub(r'\(.*?\)|\(.*?\)|\(.*?\)|\(.*?\)|\【.*?\】',"",foo) #去掉括号和括号里的内容
drop_jianfa=re.sub(r'醋|炙|制|炒|炮|煅|盐|酒|法',"",drop_kuohao) #去掉炙/制等煎法
drop_fuhao=re.sub(r'\r|\n',"",drop_jianfa)
res = re.split(r',|,',drop_fuhao) #按照逗号分割药名
for foo1 in res:
if len(foo1)<2:continue #去空/单个字符
elif '各'and'两' in foo1:continue #去各二两
elif '升' in foo1:continue #去水三升
else:
answer.append(foo1)
return answer
三、语法
例
- runoo+b +前面的字符出现1次/多次,至少一次
- runoo*b 0次/1次/多次
- runoo?r 0次/1次
非打印字符(转义字符)
\cx Control+字母(大小写都可)
\f 换页符
\n 换行符
\r 回车符
\s 空白字符,空格/制表符/换页符
\S 非空白字符
\t 制表符
\v 垂直制表符
特殊字符
^ 开始
$ 结束
() 子表达式的开始和结束
1次/多次
0次/1次/多次
?0次/1次
限定符
等价于{1,}
等价于{0,}
? 等价于{0,1}
{n} 匹配确定n次
{n,} 至少n次
{n,m} 至少n次之多m次
定位符
^
$
\b 匹配一个单词边界
\B 匹配非单词边界
/\bCha/ ///匹配 Chapter
/ter\b/ ///匹配 Chapter
/\Bapt/ ///匹配 Chapter
限定符和定位符不可同时使用
元字符
^
$
*
+
?
{n}
{n,}
{n,m}
?
//当?加在任何限制符后面时,匹配模式贪婪
//对于“oooo”
'o+?' 匹配单个"o"
'o+' 匹配所有'o'
. 匹配除换行符\n \r外的任何单个字符
(pattern) 匹配pattern并获取匹配项
(?:pattern)
(?=pattern)
(?!pattern)
(?<!pattern)
x|y x或y
[xyz] 字符集合,匹配包含的任意一个字符
[^xyz] 负值字符集合,匹配未包含的任意字符
[a-z] 字符范围
[^a-z] 负值字符范围,不在指定范围内的任意字符
\b 单词边界
\B 非单词边界
\cx
\d 数字,[0-9]
\D 非数字[^0-9]
\f 换页符
\n 换行符
\r 回车符
\s 空白字符
\S 非空白字符
\t 制表符
\v 垂直制表符
\w 字母/数字/下划线,[A-Za-z0-9_]
\W 非字母/数字/下划线
\xn
\num
\n
\nm
\nml
un