Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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,我需要从字符串中查找出生日期的年份,只能从18xx和19xx开始 我用正则表达式来解决这个任务 我有测试testbirtdays='ABCDEFG 01.19.1701 1801 02.18.1901 2001' def getNumbers(str): array = re.findall(r'[0-9]+', str) return array 我可以使用此功能,但输出将为: getNumbers(testbirtdays) #['01','19','1701','1

我需要从字符串中查找出生日期的年份,只能从
18xx
19xx
开始

我用正则表达式来解决这个任务

我有测试
testbirtdays='ABCDEFG 01.19.1701 1801 02.18.1901 2001'

def getNumbers(str): 
    array = re.findall(r'[0-9]+', str) 
    return array 
我可以使用此功能,但输出将为:

getNumbers(testbirtdays)

#['01','19','1701','1801','02','18','1901','2001']

我的函数不能做两件事:

  • 我只需要从
    18
    19

  • 我只需要
    4x
    数字就可以得到年份而忽略月份/天

  • 所以我需要像这样的输出:

    #['1801','1901']

    您可以使用

    r'(?<![0-9])1[89][0-9]{2}(?![0-9])'
    
    请参见

    正则表达式详细信息:

    • (?-左侧不允许立即出现ASCII数字
    • \b
      -单词边界
    • 1
      -一个
      1
      数字
    • [89]
      -
      8
      9
    • [0-9]{2}
      -两个ASCII数字
    • (?![0-9])
      -右侧或右侧不允许立即出现ASCII数字
    • \b
      -单词边界
    见:

    重新导入
    数字:
    
    返回re.findall(r’(?您需要一个更具体的正则表达式,如
    1[8-9][0-9]{2}
    :a
    1
    ,然后是
    89
    中的一个,然后是两位数字

    您还可以执行
    (?:18 | 19)[0-9]{2}
    18
    19
    开头,然后执行其他两位数字

    def getNumbers(value):
        return re.findall(r'1[8-9][0-9]{2}', value)
    
    r = getNumbers('ABCDEFG 01.19.1701 1801 02.18.1901 2001')
    print(r)  # ['1801', '1901']
    
    这里有一个方法:

    import re
    
    re.findall(r'\b18\d{2}\b|\b19\d{2}\b', testbirtdays)
    
    输出:

    ['1801', '1901']
    
    ['1801', '1901']
    
    试试这个:

    def get_years(str):
        return re.findall(r"((?:18|19)\d{2})\b", str)
    
    print(get_years(testbirtdays))
    
    输出:

    该模式查找1后跟8或9,以及2个以上的数字

    输出:


    ['1801',1901']

    字符类
    []
    中的
    并不意味着
    而是一个管道字符,但这是我得到的输出:
    ['1801',1901']
    你得到了输出,但它可能也匹配
    1 | 01
    啊,对了。现在我得到了它-
    []
    本身执行
    部分,因此它应该是
    [89]
    。准确地说,但是现在您仍然可以在例如55180155中获得部分匹配,我认为这不是期望的结果。Wiktor Stribiżew提供的说明了如何防止这种情况。
    def get_years(str):
        return re.findall(r"((?:18|19)\d{2})\b", str)
    
    print(get_years(testbirtdays))
    
    ['1801', '1901']
    
    test = 'ABCDEFG 01.19.1701 1801 02.18.1901 2001'
    pattern = r'1[89]\d{2}'    
    re.findall(pattern, test)