Python 如何正确分割数字

Python 如何正确分割数字,python,regex,re,Python,Regex,Re,我正在尝试将英语字符与非英语字符分开。但我看到数字没有保留。我想在re.compile中使用它。有办法吗 代码: import re a = 'Этап 51 Stage 51' eng = re.compile(r'[^\u0041-\u024f]') b=eng.sub(' ',a) print('eng is >',b) noneng = re.compile(r'[\u0041-\u024f]') c=noneng.sub(' ',a) print('noneng is>

我正在尝试将英语字符与非英语字符分开。但我看到数字没有保留。我想在
re.compile
中使用它。有办法吗

代码

import  re
a = 'Этап 51 Stage 51'
eng = re.compile(r'[^\u0041-\u024f]')
b=eng.sub(' ',a)
print('eng is >',b)

noneng = re.compile(r'[\u0041-\u024f]')
c=noneng.sub(' ',a)
print('noneng is>',c)

eng is > Stage   
noneng> Этап 51   51
eng is > Stage 51   
noneng is> Этап 51
输出

import  re
a = 'Этап 51 Stage 51'
eng = re.compile(r'[^\u0041-\u024f]')
b=eng.sub(' ',a)
print('eng is >',b)

noneng = re.compile(r'[\u0041-\u024f]')
c=noneng.sub(' ',a)
print('noneng is>',c)

eng is > Stage   
noneng> Этап 51   51
eng is > Stage 51   
noneng is> Этап 51
预期产出

import  re
a = 'Этап 51 Stage 51'
eng = re.compile(r'[^\u0041-\u024f]')
b=eng.sub(' ',a)
print('eng is >',b)

noneng = re.compile(r'[\u0041-\u024f]')
c=noneng.sub(' ',a)
print('noneng is>',c)

eng is > Stage   
noneng> Этап 51   51
eng is > Stage 51   
noneng is> Этап 51

第一个正则表达式匹配的字符代码不在十六进制值
41
24f
之间的任何字符。输入字符串中的非英语字符不在此范围内。10个标准数字的字符代码介于
30
39
十六进制之间,因此它们也不在此范围内。因此,第一个表达式匹配输入字符串中的数字和非英语字符,并删除它们。剩下的只是(非数字)英文字符

第二个表达式的作用正好相反,将字符与
41
24f
范围内的代码进行匹配。它与前面的表达式不匹配的内容完全匹配,只是“Stage”,因此这些字符将被删除,其他所有字符将被保留

您当前的表达式不够复杂,无法执行所需的操作。无论在表达式中使用什么范围,这两个表达式都将始终相互匹配,因此,如果其中一个表达式不消除数字,则另一个表达式将消除数字。您要做的是编写两个表达式,它们要么匹配英文字符,要么匹配非英文字符,但都不匹配数字字符

下面的代码将删除英文或非英文文本,但始终保留数字。它只是修复了第一个忽略数字的表达式:

import  re
a = 'Этап 51 Stage 51'
eng = re.compile(r'(?=[^\u0041-\u024f])[^0-9]')
b=eng.sub(' ',a)
print('eng is >',b)

noneng = re.compile(r'[\u0041-\u024f]')
c=noneng.sub(' ',a)
print('noneng is>',c)
结果:

eng is >      51 Stage 51
noneng is> Этап 51       51

注意:我不明白你为什么期望你展示的结果。为什么你会期望你的代码会删除一对数字字符而不是另一对?你一定会想到这里发生了比每个角色都被独立考虑和删除更复杂的事情。但这就是这里要做的一切。

maketrans/translate
对于这类事情通常比正则表达式更快

import string

noASCII = str.maketrans('','',string.printable) # ASCII only (not all unicode)
def onlyENG(a):
    return a.translate(str.maketrans('','',a.translate(noASCII)))

noLetters = str.maketrans('','',string.ascii_letters)
def nonENG(a):
    return a.translate(noLetters)
输出:

onlyENG('Этап 51 Stage 51') # ' 51 Stage 51'

nonENG('Этап 51 Stage 51')  # 'Этап 51  51'

您的输入
a
是否总是采用相同的格式?目前,模式不清楚您在尝试做什么。你能给出更多的例子和/或更详细的描述什么是“英语单词”吗