re.sub的使用方法有哪些?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了re.sub的使用方法有哪些?相关的知识,希望对你有一定的参考价值。

参考技术A re是正则的表达式,sub是substitute表示替换

re.sub是相对复杂点的替换

举个例子:

inputs = "hello 11 word 11"

想11变成22

replacestr = inputs.replace("11","22)

但是如果是inputs = “hello 123 world 345”

想把数字都替换成222

就需要用正则替换

re.sub的参数: 有五个参数

re.sub(pattern, repl, string, count=0, flags=0)

其中三个必选参数:pattern, repl, string

两个可选参数:count, flags

第一个:pattern

pattern,表示正则中的模式字符串。

反斜杠加数字(\N),则对应着匹配的组(matched group) 

比如\6,表示匹配前面pattern中的第6个group 

第二个参数:repl

repl,就是replacement,被替换,的字符串的意思。

repl可以是字符串,也可以是函数。

repl是字符串

如果repl是字符串的话,其中的任何反斜杠转义字符,都会被处理的。

即:

\n:会被处理为对应的换行符; 

\r:会被处理为回车符; 

其他不能识别的转移字符,则只是被识别为普通的字符: 

比如\j,会被处理为j这个字母本身; 

反斜杠加g以及中括号内一个名字,即:\g,对应着命了名的组,named group

第三个参数:string

string,即表示要被处理,要被替换的那个string字符串。

没什么特殊要说明。

第四个参数:count

举例说明:

继续之前的例子,假如对于匹配到的内容,只处理其中一部分。

比如对于:

hello 123 world 456 nihao 789

1

只是像要处理前面两个数字:123,456,分别给他们加111,而不处理789,

那么就可以写成:

replacedStr = re.sub("(?P\d+)", _add111, inputStr, 2);

python - 使用 re.sub 删除两个字符之间的空格

【中文标题】python - 使用 re.sub 删除两个字符之间的空格【英文标题】:python - remove whitespace between two characters using re.sub 【发布时间】:2021-05-02 16:49:37 【问题描述】:

我有一对列,如下所示:

x = ["a b williams", "e g", "z z specialists"]
y = ["j j winston", "hb d party supplies", "t t ice cream"]
df = pd.DataFrame(x,y)

我希望能够使用re.sub 删除两个单个字符之间的空格。我尝试了以下方法:

re.sub("(?<=\\w\\b)"\\s"(?=\\w\\b)", "", df)

但是,当我运行代码时,出现以下错误。

SyntaxError: unexpected character after line continuation character

我不确定自己做错了什么。期望的结果是:

jj winston             ab williams
hb d party supplies              eg
tt ice cream           zz specialists

请指教。任何建议表示赞赏。

【问题讨论】:

"(?&lt;=\\w\\b)"\\s"(?=\\w\\b)" 语法无效。 那是df 的例子代表吗?您真的要在索引中替换吗?正则表达式相当简单,你可以使用r'(?&lt;=\b[^\W\d_])\s(?=[^\W\d_]\b)'。或者,如果您真的想将数字和下划线视为单词,r'(?&lt;=\b\w)\s(?=\w\b)' @WiktorStribiżew 我不确定你对索引的意思 我的意思是,df.replace(regex_here,'', regex=True) 不会在索引列中替换。好的,re.sub(r'(?&lt;=\b[^\W\d_])\s(?=[^\W\d_]\b)','', text) 对你有用吗?请注意,您不能将df 作为输入参数传递给re.sub,它必须是一个字符串。这就是为什么我要询问您数据的真实结构。 @TigerhawkT3 您不能将数据帧作为输入传递给re.sub 【参考方案1】:

你可以使用

(?<=\b[^\W\d_])\s(?=[^\W\d_]\b)
(?<=\b\w)\s(?=\w\b)

请参阅regex demo。请注意,[^\W\d_] 模式匹配 Python re 中的任何 Unicode 字母。 \w 匹配 Unicode 字母、数字、_ 以及一些变音符号和其他连接符标点符号。

详情

(?&lt;=\b[^\W\d_]) - 一个正向的后视,匹配一个紧跟在一个字母前面的位置作为一个完整的单词(因为它前面有一个单词边界) \s - 一个空格字符 (?=[^\W\d_]\b) - 一个正向预测,它匹配一个紧跟一个字母作为整个单词的位置(因为它后面跟着一个单词边界)。

这是一个 Pandas 演示:

x = ["a b williams", "e g", "z z specialists"]
y = ["j j winston", "h d party supplies", "t t ice cream"]
df = pd.DataFrame(x,y)
rx = r'(?<=\b[^\W\d_])\s(?=[^\W\d_]\b)'
df.index = df.index.to_series().replace(rx, '', regex=True)
df = df.replace(rx, '', regex=True)
# => df
#                                 0
# jj winston            ab williams
# hd party supplies              eg
# tt ice cream       zz specialists

由于DataFrame.replaceregex=True不涉及索引列,所以必须单独处理,因此增加了df.index = df.index.to_series().replace(rx, '', regex=True)这行代码。

【讨论】:

你能解释一下单数模式\d_ 是如何工作的吗?只是说只有一个空格吗? @jvalenti \d_[^\W\d_] 否定字符类中表示digit_,整体含义是任何字符,但非单词字符、数字和@ 987654339@。换句话说,除了数字和_之外的任何单词字符。【参考方案2】:

您的正则表达式非常接近要求,可以稍作修改,如下所示:

r'(?<=\b\w)(\s)(?=\w\b)'

注意使用原始引号 r'...',这样您就不需要在正则表达式中使用双 \ for。

Regex Demo

更好地编译正则表达式以加快处理速度,因为它被多次使用

pattern = re.compile(r'(?<=\b\w)(\s)(?=\w\b)')

然后重复使用您的代码:

x = ["a b williams", "e g", "z z specialists"]
y = ["j j winston", "h d party supplies", "t t ice cream"]
df = pd.DataFrame(x,y)

转换索引:

df.index = df.index.to_series().str.replace(pattern, '')

转换数据列:

df[0] = df[0].str.replace(pattern, '')

你的错误解释:

    你不能直接在整个 pandas DataFrame 上使用 re.sub 您的正则表达式包含 4 个引号“其中第二个”结束正则表达式,因此正则表达式的后续部分被 \ 标记视为续行,并且在续行之后被视为无效的字符

【讨论】:

【参考方案3】:

使用re.sub,我建议如下:

# your lists    
x = ["a b williams", "e g", "z z specialists"]
y = ["j j winston", "hb d party supplies", "t t ice cream"]

# replacements
x = [re.sub(r'(\b\w)(\s)(\w\b)', r'\1\3', el) for el in x]
y = [re.sub(r'(\b\w)(\s)(\w\b)', r'\1\3', el) for el in y]

# pd dataframe after the process
df = pd.DataFrame(x,y)

【讨论】:

以上是关于re.sub的使用方法有哪些?的主要内容,如果未能解决你的问题,请参考以下文章

python - 使用 re.sub 删除两个字符之间的空格

`re.sub(pattern, functor, string)` 用于 C++

使用 re.sub 替换多个字符 [重复]

re.sub()介绍和用法

使用 re.sub 的更好方法

如何在 re.sub 上迭代列表并使用 python 替换字符串中的变量?