Python正则表达式:删除可选字符

Python正则表达式:删除可选字符,python,regex,Python,Regex,我有一个带有可选字符的正则表达式模式,但是在输出端我想删除这些可选字符。例如: string = 'a2017a12a' pattern = re.compile("((20[0-9]{2})(.?)(0[1-9]|1[0-2]))") result = pattern.search(string) print(result) 我可以有这样的匹配,但我想要的输出是: desired output = '201712' 多谢各位 试试这个: import re string = 'a

我有一个带有可选字符的正则表达式模式,但是在输出端我想删除这些可选字符。例如:

string = 'a2017a12a'    
pattern =  re.compile("((20[0-9]{2})(.?)(0[1-9]|1[0-2]))")
result = pattern.search(string)
print(result)
我可以有这样的匹配,但我想要的输出是:

desired output = '201712'
多谢各位

试试这个:

import re
string = 'a2017a12a'    
pattern =  re.findall("(\d+)", string)  # this regex will capture only digit
print("".join(p for p in pattern))  # combine all digits
输出:

201712
'201712'

若要从字符串中删除所有字符,则可以执行此操作

import re
string = 'a2017a12a'
re.sub('[A-Za-z]+','',string)
输出:

201712
'201712'

您已经在组中捕获了预期的数据,现在可以使用
re.sub
将整个匹配替换为组1和组2的内容

试试你修改过的Python代码

import re

string = 'a2017a12a'    
pattern =  re.compile(".*(20[0-9]{2}).?(0[1-9]|1[0-2]).*")
result = re.sub(pattern, r'\1\2', string)
print(result)
请注意,我是如何在模式周围添加了
*
,以便匹配并删除数据周围的任何额外字符的。此外,删除了不需要的额外括号。这也适用于字符串,其中文本周围可能有其他数字,如下面的
hello123 a2017a12a和其他99个数字

产出

201712

您可以将
re.sub
与模式
\D
(=不是数字)一起使用:


您可以使用re module方法获得所需的输出,如:

    import re

    #method 1
    string = 'a2017a12a'
    print (re.sub(r'\D', '', string))

    #method 2
    pattern =  re.findall("(\d+)", string)
    print("".join(p for p in pattern))
您也可以参考下面的文档了解更多信息

使用
(\d+)
获取号码