Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当前面有数字时,递归匹配每个非数字字符_Python_Regex - Fatal编程技术网

Python 当前面有数字时,递归匹配每个非数字字符

Python 当前面有数字时,递归匹配每个非数字字符,python,regex,Python,Regex,我试图匹配每个直接前面有数字的非数字字符。我们的想法是将O替换为0的数字 例如: 所需输出为 5800 1010 2000m FOO O 我在之前的一次提问中尝试过使用这个答案,但我没有设法使正则表达式适应我的目的 下面是一些我尝试过的正则表达式,但没有成功(而且理由充分):(\d\K(?>O|)(?1))或\d\K(?:O|)(?R))与递归无关,只需使用一个简单的while循环: import re strings = ["58OO", "1O1O", "2OOOm", "FOO", "

我试图匹配每个直接前面有数字的非数字字符。我们的想法是将
O
替换为
0
的数字

例如:

所需输出为

5800
1010
2000m
FOO
O
我在之前的一次提问中尝试过使用这个答案,但我没有设法使正则表达式适应我的目的


下面是一些我尝试过的正则表达式,但没有成功(而且理由充分):
(\d\K(?>O|)(?1))
\d\K(?:O|)(?R))

与递归无关,只需使用一个简单的while循环:

import re

strings = ["58OO", "1O1O", "2OOOm", "FOO", "O"]

pattern = re.compile(r'(?<=\d)O')

for item in strings:
    while True:
        olditem = item
        item = pattern.sub("0", item)
        if item == olditem:
            # no replacement was made
            break

    print(item)

与递归无关,只需使用一个简单的while循环:

import re

strings = ["58OO", "1O1O", "2OOOm", "FOO", "O"]

pattern = re.compile(r'(?<=\d)O')

for item in strings:
    while True:
        olditem = item
        item = pattern.sub("0", item)
        if item == olditem:
            # no replacement was made
            break

    print(item)
安装时间:

(?安装时间:


(?一个简单的sub就足够了

来自
python
解释器的示例:

>>> import re
>>> raw = '''
58OO
O1O1O
2OOOm
FOO
O
'''
>>>
>>> print(re.sub(r'(\d+)(O+)', lambda m: m.group(1) +  '0' * len(m.group(2)), raw))

5800
O1010
2000m
FOO
O

一个简单的潜艇就足够了

来自
python
解释器的示例:

>>> import re
>>> raw = '''
58OO
O1O1O
2OOOm
FOO
O
'''
>>>
>>> print(re.sub(r'(\d+)(O+)', lambda m: m.group(1) +  '0' * len(m.group(2)), raw))

5800
O1010
2000m
FOO
O

请添加您在中尝试的代码question@WiktorStribiżew我添加了一些我尝试过的正则表达式的示例。我清楚地理解它们为什么不起作用,但无法找到一种方法来实现我想要的。您尝试的模式适用于后跟
O
或相同模式的任何数字。您不需要递归,您需要重复repl直到找不到匹配项为止(参见Jan的答案),或者使用查找功能检查
O
(参见Ryszard的答案)之前是否有任何数字和Os。请添加您在中尝试的代码question@WiktorStribiżew我添加了一些我尝试过的正则表达式的示例。我清楚地理解它们为什么不起作用,但无法找到一种方法来实现我想要的。您尝试的模式适用于后跟
O
的任何数字或相同的模式。您不需要递归,或者需要重复rep系紧鞋带,直到找不到匹配项为止(参见Jan的答案),或者使用查找功能检查
O
(参见Ryszard的答案)之前是否有任何数字和Os。谢谢你的输入。我知道我可以用循环来实现。我可能应该提到它,但我试图避免循环,因为我发现这有点过分。我有数十万个数字要修正。我必须测试它,但我相信用正则表达式来实现它更有效。谢谢你的输入。我知道我可以做到这是一个循环。我应该提到它,但我试图避免循环,因为我发现它有点过分。我有数十万个数字要修正。我必须测试它,但我相信使用正则表达式更有效。
5800
1010
2000m
FOO
O
>>> import re
>>> raw = '''
58OO
O1O1O
2OOOm
FOO
O
'''
>>>
>>> print(re.sub(r'(\d+)(O+)', lambda m: m.group(1) +  '0' * len(m.group(2)), raw))

5800
O1010
2000m
FOO
O