stackoverflow原文这里。
str.replace(
old, # 要被替换的老字符串
new, # 替换老字符串的新字符串
count # 可选参数:设定替换多少个老的字符串
)
对于一般的文本替换,我应该使用string.replace
呢,还是应该使用re.sub
呢?
re.sub
相比,请优先使用string.replace
。string.repalce
会让人避开正则表达式的所有缺陷(比如 转义),并且对于任何版本的ptyhon来讲它的运算速度更快。tring.replace
一般比正则表达式更可取。正则表达式是非常强大的,但是它一般运算速度更慢,一般更难写、调bug和维护。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
函数更好;否则,请使用曾泽表达式。
举个栗子:
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
点击链接。