python笔记: string.replace vs re.sub

stackoverflow原文这里。

str.replace(
old, # 要被替换的老字符串
new,  # 替换老字符串的新字符串
count  # 可选参数:设定替换多少个老的字符串
)

Question:

对于一般的文本替换,我应该使用string.replace呢,还是应该使用re.sub呢?

Answer:

  • 一方面:和re.sub相比,请优先使用string.replacestring.repalce会让人避开正则表达式的所有缺陷(比如 转义),并且对于任何版本的ptyhon来讲它的运算速度更快
  • 另一方面:但是,当你知道怎么如何调整的时候,tring.replace一般比正则表达式更可取。正则表达式是非常强大的,但是它一般运算速度更慢,一般更难写、调bug和维护。
    – 但是有时候正则表达式,可以用20左右各字符,完成无数string函数才能做到的事;并且有可能意味的强调string函数的“运算速度”,忽视了正则表达式实际的运算时间也能这么短;最后是正则的复杂性,的确正则表达式可以复杂的吓人,但是如果string函数一大堆,那么正则相对的非常易读、维护。
    – 对于“大海捞针”式(范围攻击)的搜索需求中,正则表达式非常棒,但在具体明确式(精确打击)的所有需求中,它就一般般了。
    附:当你不确定究竟使用string函数、还是正则表达式更好的时候,不妨参考这些指导原则:
  • Is the pattern you’re looking for highly static? For example, do you want to split a string on every comma, pipe, or tab?
  • 是开发者的时间,还是计算机运算的效率更重要? 你的优先选择是哪个? Remember: Hardware is cheap, programmers are expensive.

我的第一经验告诉我: 如果你花5分钟来解决这个问题,你能大致地想出一个非正则方法的想法吗?
如果你对上边问题的回答都是“YES”, 那么很可能用string函数更好;否则,请使用曾泽表达式。


replace搭配正则表达式,可以实现模糊匹配

举个栗子:

import pandas as pd
df = pd.DataFrame([['五代机', '中国五代机'], ['航母', '美国航母']], columns=['col1', 'col2'])
print(df)
# df结果
  col1   col2
0  五代机  中国五代机
1   航母   美国航母
  • 所有列&单条件:
print(df.replace(r'五代机', 'J20', regex=True)) 
"""等价于
print(df.replace('五代机', 'J20', regex=True))
"""
# 结果如下
   col1   col2
0   J20   中国J20 
1   航母   美国航母
  • 单列单条件:比如把字段col2,或者col1的“五代机”替换为“J20
df['col2'].replace(r'五代机', 'J20', regex=True, inplace=True)
print(df)
# 结果如下:
  col1   col2
0  五代机  中国J20
1   航母   美国航母

print(df.replace('五代机', 'J20')) 
"""等价于 
print(df.replace(r'五代机', 'J20'))
"""
# 结果如下
  col1   col2
0  J20  中国五代机
1   航母   美国航母
  • 单列多条件:
    – 比如把字段col2里“五代机”和“航母”替换为“J20”和“001”.
df.replace({'col2': [r'五代机', r'航母']}, {'col2': ['J20', '001']}, regex=True, inplace=True)
print(df)
# 结果如下:
  col1   col2
0  五代机  中国J20
1   航母  美国001

– 比如把字段col2里*含有“五代机”和含有“航母”的,替换为“J20”和“001”.

df.replace({'col2': [r'.*五代机.*', r'.*航母.*']}, {'col2': ['J20', '001']}, regex=True, inplace=True)
print(df)
# 结果如下:
  col1   col2
0  五代机  J20
1   航母   001

更多常见正则符号regex 点击链接。

你可能感兴趣的:(python:数据预处理)