获取数字正则表达式 python 后的最后一部分
Get last part after number regex python
我之间总是有 2 个数字,我想提取 3 之前的所有内容,所以 Salvatore
以及 2 Abdulla
之后的所有内容
例如我有以下内容:
txt = "Salvatore32Abdulla"
first = re.findall("^\D+", txt)
last = re.search(,txt)
预期结果:
first = 'Salvatore'
last = 'Abdulla'
我可以得到第一部分,但是在2之后我无法得到last
部分
您可以使用这样的正则表达式:
txt = "Salvatore32Abdulla"
regex = r"(\D+)\d\d(\D+)"
match = re.match(regex, txt)
first = match.group(1)
last = match.group(2)
为什么我没有得到预期的结果?
您目前有一个问题与您的正则表达式有关,另一个与您的代码有关。
您的正则表达式包含 ^
,它将其锚定到字符串的开头。这将只允许您匹配 Salvatore
。您正在使用 findall
(如果您将正则表达式简单地更改为 \D+
,这是合适的选择),但现在它只得到一个结果。
不需要第二个 re.search
调用,因为您可以使用 findall
捕获 first 和 last给出适当的模式(见下文)。
我该如何解决?
import re
txt = "Salvatore32Abdulla"
x = re.findall("\D+", txt)
print(x)
结果:
['Salvatore', 'Abdulla']
您也可以通过稍微更改 @ctwheels 建议的解决方案来在一行中完成此操作,如下所示。我建议您使用 re.findall
,因为这样可以一次完成工作。
import re
txt = "Salvatore32Abdulla"
选项-1
非数字部分的单行提取。
first, last = re.findall("\D+", txt)
print((first, last))
('Salvatore', 'Abdulla')
选项-2
如果您(出于某种原因)也想跟踪介于两者之间的数字:
first, num, last = re.findall("(\D+)(\d{2})(\D+)", txt)
print((first, num, last))
('Salvatore', '32', 'Abdulla')
选项-3
作为 Option-2 的扩展并考虑具有 'Salvatore####...###Abdulla'
形式的文本,其中 ####...###
表示分隔非的连续数字块-数字部分,你可能不知道也可能不知道中间有多少数字,你可以使用以下内容:
first, num, last = re.findall("(\D+)(\d*)(\D+)", txt)
print((first, num, last))
('Salvatore', '32', 'Abdulla')
最后一位后的部分:
match = re.search(r'\D+$',txt)
if match:
print(match.group())
结果:Abdulla
解释
--------------------------------------------------------------------------------
\D+ non-digits (all but 0-9) (1 or more times
(matching the most amount possible))
--------------------------------------------------------------------------------
$ before an optional \n, and the end of the
string
我之间总是有 2 个数字,我想提取 3 之前的所有内容,所以 Salvatore
以及 2 Abdulla
之后的所有内容
例如我有以下内容:
txt = "Salvatore32Abdulla"
first = re.findall("^\D+", txt)
last = re.search(,txt)
预期结果:
first = 'Salvatore'
last = 'Abdulla'
我可以得到第一部分,但是在2之后我无法得到last
部分
您可以使用这样的正则表达式:
txt = "Salvatore32Abdulla"
regex = r"(\D+)\d\d(\D+)"
match = re.match(regex, txt)
first = match.group(1)
last = match.group(2)
为什么我没有得到预期的结果?
您目前有一个问题与您的正则表达式有关,另一个与您的代码有关。
您的正则表达式包含 ^
,它将其锚定到字符串的开头。这将只允许您匹配 Salvatore
。您正在使用 findall
(如果您将正则表达式简单地更改为 \D+
,这是合适的选择),但现在它只得到一个结果。
不需要第二个 re.search
调用,因为您可以使用 findall
捕获 first 和 last给出适当的模式(见下文)。
我该如何解决?
import re
txt = "Salvatore32Abdulla"
x = re.findall("\D+", txt)
print(x)
结果:
['Salvatore', 'Abdulla']
您也可以通过稍微更改 @ctwheels 建议的解决方案来在一行中完成此操作,如下所示。我建议您使用 re.findall
,因为这样可以一次完成工作。
import re
txt = "Salvatore32Abdulla"
选项-1
非数字部分的单行提取。
first, last = re.findall("\D+", txt)
print((first, last))
('Salvatore', 'Abdulla')
选项-2
如果您(出于某种原因)也想跟踪介于两者之间的数字:
first, num, last = re.findall("(\D+)(\d{2})(\D+)", txt)
print((first, num, last))
('Salvatore', '32', 'Abdulla')
选项-3
作为 Option-2 的扩展并考虑具有 'Salvatore####...###Abdulla'
形式的文本,其中 ####...###
表示分隔非的连续数字块-数字部分,你可能不知道也可能不知道中间有多少数字,你可以使用以下内容:
first, num, last = re.findall("(\D+)(\d*)(\D+)", txt)
print((first, num, last))
('Salvatore', '32', 'Abdulla')
最后一位后的部分:
match = re.search(r'\D+$',txt)
if match:
print(match.group())
结果:Abdulla
解释
--------------------------------------------------------------------------------
\D+ non-digits (all but 0-9) (1 or more times
(matching the most amount possible))
--------------------------------------------------------------------------------
$ before an optional \n, and the end of the
string