在中将标志作为位置参数传递时,Python regex不工作re.sub公司

2024-09-30 02:33:10 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我的问题是:

我正在尝试替换字符串中不是“a”或“C”大小写的任何内容。我的琴弦都是三个字符。(实际上,具体的两个字母会改变,这就是为什么我不硬编码否定的值。)

所以,我想我会的

re.sub(r'[ac]', "X", "ABC", re.IGNORECASE)

但是,我得到的是“XXC”。我期待“AXC”。在

我的全部数据

^{pr2}$

我得到的是:

['XXC', 'XXc', 'XXC', 'XXc', 'aXX', 'aXc', 'aXX', 'aXc']

为什么案例忽略替换“A”?为什么它有时会取代C?(注意它是如何将“abC”变成“aXX”的。在

如果我这样做:

map(lambda s: re.sub(r'[^acAC]', "X", s), [ "ABC", "ABc", "AbC", "Abc", "aBC", "aBc", "abC", "abc" ])

我得到了我想要的:

['AXC', 'AXc', 'AXC', 'AXc', 'aXC', 'aXc', 'aXC', 'aXc']

我必须使用r'[^acAC]'??难道没有办法不区分大小写来补充正则表达式吗?在

我也很感兴趣,在vim中,如果我把所有这些字符串放到一个文本文件中

:%s/[^ac]/X/gi

我做对了。(而且,尽管这可能是亵渎神明的,如果我在perl中这样做:

    #! /usr/bin/perl

    use strict;

    foreach my $gene ( "ABC", "ABc", "AbC", "Abc", "aBC", "aBc", "abC", "abc") {    
            my $replaced = $gene;
            $replaced =~ s/[^ac]/X/gi;
            printf("%s\n", $replaced);
    }

我明白了

AXC
AXc
AXC
AXc
aXC
aXc
aXC
aXc

鲁比也是:

irb(main):001:0> ["ABC", "ABc", "AbC", "Abc", "aBC", "aBc", "abC", "abc"].collect{|s| s.gsub(/[^ac]/i,"X") }
=> ["AXC", "AXc", "AXC", "AXc", "aXC", "aXc", "aXC", "aXc"]

如果不执行r'[^acAC]',我如何在python中执行等效操作?在

谢谢!在


Tags: reacabcacacaxcaxxxxc
1条回答
网友
1楼 · 发布于 2024-09-30 02:33:10

flags作为关键字参数而不是位置参数传递:

>>> re.sub(r'[^ac]', "X", "ABC", flags=re.IGNORECASE)
'AXC'

看着source code

^{pr2}$

很明显,当您将re.IGNORECASE作为位置参数传递时,它实际上是传递给count。可以通过以下错误进行验证:

>>> re.sub(r'[^ac]', "X", "ABC", re.IGNORECASE, count=2)
Traceback (most recent call last):
  File "<ipython-input-82-8b949ec4f925>", line 1, in <module>
    re.sub(r'[^ac]', "X", "ABC", re.IGNORECASE, count=2)
TypeError: sub() got multiple values for keyword argument 'count'

因此,当re.IGNORECASE等于2时,输出为'XXC'(只有两个项目被替换)。在

^{4}$

相关问题 更多 >

    热门问题