Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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,我对Python非常陌生,我刚刚开始学习正则表达式。我试图定义一个函数,它将包含零个或多个数字序列的字符串作为输入,并返回字符串中所有数字序列的列表,然后对它们进行排序。如果没有,它会打印出没有 这是我的密码: def DigitSequence(string): pattern=re.compile(r'[0-9]+') k=re.findall(pattern,string) if len(k)!=0: return(sorted(k)) el

我对Python非常陌生,我刚刚开始学习正则表达式。我试图定义一个函数,它将包含零个或多个数字序列的字符串作为输入,并返回字符串中所有数字序列的列表,然后对它们进行排序。如果没有,它会打印出没有

这是我的密码:

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']