Python 用于查找所有数字序列的正则表达式函数
我对Python非常陌生,我刚刚开始学习正则表达式。我试图定义一个函数,它将包含零个或多个数字序列的字符串作为输入,并返回字符串中所有数字序列的列表,然后对它们进行排序。如果没有,它会打印出没有 这是我的密码:Python 用于查找所有数字序列的正则表达式函数,python,regex,Python,Regex,我对Python非常陌生,我刚刚开始学习正则表达式。我试图定义一个函数,它将包含零个或多个数字序列的字符串作为输入,并返回字符串中所有数字序列的列表,然后对它们进行排序。如果没有,它会打印出没有 这是我的密码: def DigitSequence(string): pattern=re.compile(r'[0-9]+') k=re.findall(pattern,string) if len(k)!=0: return(sorted(k)) el
def DigitSequence(string):
pattern=re.compile(r'[0-9]+')
k=re.findall(pattern,string)
if len(k)!=0:
return(sorted(k))
else:
return('None')
print( DigitSequence("My number is 98765 and my friend\'s number is 12345.") )
#This should return me ['12345','98765']. And it does.
但是有没有更好的办法呢。如果我这样做,我会错过什么案例吗。我曾想过使用pattern=re.compile(r'\d*')
,但我觉得这和我所做的是一样的。如果我错了,请纠正我。re.findall()
在正确的轨道上。需要注意的其他几点:
re.findall()
r“\d+”
。否则使用“[0-9]+”
99
在111
之前?还是在'9'9
之前的'1'11
\d
与[0-9]
完全相同,但在这些模式中使用的量词不同<代码>*匹配前面的实体零次或多次,而+
匹配一次或多次。所以,是的,在很多情况下,这两种模式会给你相同的结果,但有一个重要的区别。是的。我也得到了同样的结果。那些案子呢……我会错过什么吗。我应该把+或*放在一起,这样在字符串中有字母数字的情况下结果就不会改变。哦,是的,你是说空格。我确实得到了这些,所以我写了另一行来清理它们,但我觉得这不是最好的方法。@HeapOverflow,那么你的意思是这对个位数不起作用?那我怎样才能捕捉到这两个呢?是否存在这样一个正则表达式项,或者我可以编写一些条件:pattern=re.compile(r'\d+\d')。像这样的?
import re
def digital_sequence(s, sort_literal=False, fullwidth_digits=False):
"""Get sorted list of numbers.
Args:
s (str): arbitrary string
sort_literal (bool): literal sort
fullwidth_digits (bool): accept full-width digits
Returns:
list
"""
r = r"\d+" if fullwidth_digits else r"[0-9]+"
k = None if sort_literal else lambda x: int(x)
return sorted(re.findall(r, s), key=k)
def print_ls(ls):
"""Customized list printing: list contents or "None".
Args:
ls (list): input list
Returns:
None
"""
print(ls) if len(ls) > 0 else print("None")
s1 = "99 and 112 and 12"
s2 = "abc"
print_ls(digital_sequence(s1)) # ['99', '112']
print_ls(digital_sequence(s2)) # None
print_ls(digital_sequence(s1, sort_literal=True)) # ['112', '99']
print_ls(digital_sequence(s1, fullwidth_digits=True)) # ['12', '99', '112']