Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/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
Regex 修改使正则表达式更加具体,以排除某些字符_Regex_Python 3.x_String_Text - Fatal编程技术网

Regex 修改使正则表达式更加具体,以排除某些字符

Regex 修改使正则表达式更加具体,以排除某些字符,regex,python-3.x,string,text,Regex,Python 3.x,String,Text,我有以下字符串s,它是对 我想得到所有的日期,所以我使用 import re s = '01.20/15 01/20.1915 1/1/19 01.11.11 1.8-24 3-4.12 01/20-09 12/12/1981 12-01/2001 1*51*12 22|1|13 03-02-1919 1-22-12 or 01-23-18 or 03-23-1984 01.11.18 or 2.2.17 or 02.02.18 or 12.1.16 12.23.1943 01-23-11 n

我有以下字符串
s
,它是对

我想得到所有的日期,所以我使用

import re
s = '01.20/15 01/20.1915 1/1/19 01.11.11 1.8-24 3-4.12 01/20-09 12/12/1981 12-01/2001 1*51*12  22|1|13 03-02-1919 1-22-12 or 01-23-18 or 03-23-1984 01.11.18 or 2.2.17 or 02.02.18 or 12.1.16 12.23.1943 01-23-11 not 12.23.192 not 02.02.1'
我得到

reg = r'\b((?:\d{1,2}(?:\.|\/|-)){2}(?:\d{4}|\d{2}))\b'
r1 = re.findall(reg,s)
r1
这接近于我想要的,但我不想要混合了
-
的字符串,例如
'01.20/15'
'3-4.12'
3-4.12

我想要的输出是这样的

['01.20/15',
 '01/20.1915',
 '1/1/19',
 '01.11.11',
 '1.8-24',
 '3-4.12',
 '01/20-09',
 '12/12/1981',
 '12-01/2001',
 '03-02-1919',
 '1-22-12',
 '01-23-18',
 '03-23-1984',
 '01.11.18',
 '2.2.17',
 '02.02.18',
 '12.1.16',
 '12.23.1943',
 '01-23-11']
不包含任何混合了
-
的数字,例如
'01.20/15'
'3-4.12'

我还尝试过修改
reg

['1/1/19',
 '01.11.11',
 '12/12/1981',
 '03-02-1919',
 '1-22-12',
 '01-23-18',
 '03-23-1984',
 '01.11.18',
 '2.2.17',
 '02.02.18',
 '12.1.16',
 '12.23.1943',
 '01-23-11']
但这不太管用


如何进一步修改
reg
以获得所需的输出?

我猜在这里,反向引用可能不是一个坏主意:

reg = r'\b((?:\d{1,2}(?:\.\b|\\b/|-\b)){2}(?:\d{4}|\d{2}))\b'

试验 输出 ['01.11.11','12/12/1981','03-02-1919','1-22-12','01-23-18', '03-23-1984', '01.11.18', '2.2.17', '02.02.18', '12.1.16', ‘12.23.1943’、‘01-23-11’、‘12.23.192’]

可以将findall()与单个捕获组一起使用,而不是使用backref

\b((?:\d{1,2}.\d{1,2}.\d{1,2}/\d{1,2}/\d{1,2}-\d{1,2}-(?:\d{2}.\d{4}))\b

扩大

import re

regex = r'\b([0-9]{1,2}([./-])[0-9]{1,2}\2\d{2,4})\b'
string = '''
01.20/15 01/20.1915  01.11.11 1.8-24 3-4.12 01/20-09 12/12/1981 12-01/2001 1*51*12  22|1|13 03-02-1919 1-22-12 or 01-23-18 or 03-23-1984 01.11.18 or 2.2.17 or 02.02.18 or 12.1.16 12.23.1943 01-23-11 not 12.23.192 not 02.02.1

'''

matches = re.findall(regex, string)

output = []
for match in matches:
    output.append(match[0])

print(output)

这可能会让你更接近你想要的:

 \b 
 (                             # (1 start)
      (?:
           \d{1,2} \. \d{1,2} \. 
        |  
           \d{1,2} / \d{1,2} /
        |  
           \d{1,2} - \d{1,2} -
      )
      (?: \d{2} | \d{4} )
 )                             # (1 end)
 \b
这将与提供的大多数输入匹配,但以下字符串除外:

RE = r'((?:\d{1,2}(?:\.|\/|-)){2}\d{1,4})'

对于第一个示例,此正则表达式将捕获
11-11-12
13-15.1645
,对于第二个示例,将捕获
01-01-11
。您可以对较长的字符串进行一些预处理,以便在
-
|
/
|
分隔符上拆分。通过在第一个分隔符上拆分,然后在第二个分隔符上拆分。。。直到您使用
re.match(post\u split[0])
re.match(post\u split[1])
找到匹配

谢谢你的密码。这与我想要的非常接近,只是我正在寻找
['01.11.11'
格式,而不是
'[(01.11.11','))
谢谢!事实上,这段代码很接近,但它捕获了
12.23.192'
,这应该不是很好的观点。我不想要
45-90-4000这样的值。我只想要日期。但我也会问另一个问题来处理这个问题
 \b 
 (                             # (1 start)
      (?:
           \d{1,2} \. \d{1,2} \. 
        |  
           \d{1,2} / \d{1,2} /
        |  
           \d{1,2} - \d{1,2} -
      )
      (?: \d{2} | \d{4} )
 )                             # (1 end)
 \b
RE = r'((?:\d{1,2}(?:\.|\/|-)){2}\d{1,4})'
11-11-12-13-15.1645
01-01-11-12