我对正则表达式很陌生,并且尝试删除所有非数字,但保留字符串的点 (.):
x = ['ABCD, EFGH ', ' 20.9&dog; ', ' IJKLM />']到目前为止,我已经尝试了以下几点:
>>> x = re.sub("\D", "", x)
209然而,我试图得到以下结果:
20.9谢谢。
发布于 2016-09-12 19:56:48
您需要一个倒字符类:
re.sub(r"[^\d.]", "", x)请注意,[^0-9.]和[^\d.]并不相同,因为\d匹配的字符比0123456789多得多。
>>> print(textwrap.fill(
... "".join(x for x in (chr(y) for y in range(0x110000))
... if re.match(r"\d", x)),
... break_long_words=True, width=10))
0123456789
٠١٢٣٤٥٦٧٨٩
۰۱۲۳۴۵۶۷۸۹
߀߁߂߃߄߅߆߇߈߉
०१२३४५६७८९
০১২৩৪৫৬৭৮৯
੦੧੨੩੪੫੬੭੮੯
૦૧૨૩૪૫૬૭૮૯
୦୧୨୩୪୫୬୭୮୯
௦௧௨௩௪௫௬௭௮௯
౦౧౨౩౪౫౬౭౮౯
೦೧೨೩೪೫೬೭೮೯
൦൧൨൩൪൫൬൭൮൯
෦෧෨෩෪෫෬෭෮෯
๐๑๒๓๔๕๖๗๘๙
໐໑໒໓໔໕໖໗໘໙
༠༡༢༣༤༥༦༧༨༩
၀၁၂၃၄၅၆၇၈၉
႐႑႒႓႔႕႖႗႘႙
០១២៣៤៥៦៧៨៩
᠐᠑᠒᠓᠔᠕᠖᠗᠘᠙
᥆᥇᥈᥉᥊᥋᥌᥍᥎᥏
᧐᧑᧒᧓᧔᧕᧖᧗᧘᧙
᪀᪁᪂᪃᪄᪅᪆᪇᪈᪉
᪐᪑᪒᪓᪔᪕᪖᪗᪘᪙
᭐᭑᭒᭓᭔᭕᭖᭗᭘᭙
᮰᮱᮲᮳᮴᮵᮶᮷᮸᮹
᱀᱁᱂᱃᱄᱅᱆᱇᱈᱉
᱐᱑᱒᱓᱔᱕᱖᱗᱘᱙
꘠꘡꘢꘣꘤꘥꘦꘧꘨꘩
꣐꣑꣒꣓꣔꣕꣖꣗꣘꣙
꤀꤁꤂꤃꤄꤅꤆꤇꤈꤉
꧐꧑꧒꧓꧔꧕꧖꧗꧘꧙
꧰꧱꧲꧳꧴꧵꧶꧷꧸꧹
꩐꩑꩒꩓꩔꩕꩖꩗꩘꩙
꯰꯱꯲꯳꯴꯵꯶꯷꯸꯹
0123456789我敢打赌你不知道印度教-阿拉伯数字系统有这么多变体。
还值得一提的是,即使在最新的3.x中,Python的正则表达式也不支持支持POSIX是命名字符类 (向下滚动到“字符类”--遗憾的是,没有锚点)。[^[:digit:].]不会做你想做的事。
发布于 2016-09-12 19:56:10
与使用类\D不同,您可以使用[...]定义自己的字符类,并使用[^...]转换该类。现在,只需将所有数字0-9和.放入该类:
>>> x = ['ABCD, EFGH ', ' 20.9&dog; ', ' IJKLM />']
>>> [re.sub("[^0-9.]", "", y) for y in x]
['', '20.9', '']当然,您也可以使用re.findall或re.search来获取字符串中的数字或点,而不是删除所有不是数字或点的内容。这样做的好处是,如果字符串包含多个数字,则这些数字不会聚集在一起:
>>> z = "foo20.9bar42.1blub"
>>> re.sub("[^0-9.]", "", z)
'20.942.1'
>>> re.findall("[0-9.]+", z)
['20.9', '42.1']发布于 2016-09-12 19:56:19
这是一个可以明确表示的简单要求:
for item in x:
print re.sub(r'[^0-9.]', "", item)https://stackoverflow.com/questions/39457780
复制相似问题