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