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