忽略所有字符,只读取字符串中的数字部分

时间:2015-07-23 23:47:50

标签: python regex

我有一个与正则表达式相关的问题。如果我有一个变量名 nodeName 我正在从.csv文件中读取它,它看起来像以下任何一种: E1_40873886,E2_40873886,40873886,40873886-A,40873886-B < / strong>即可。我可以用if elif ... else编写一段很长的代码,但我想知道python的正则表达式是否有更聪明的方法。此外,我不能像if '40873886' in {entry}:那样硬编码40873886,因为.csv文件有100万个entires并且具有不同的numberID。

2 个答案:

答案 0 :(得分:2)

这是你要找的吗? 它提取(可选)下划线后的每个数字。

import re
regex = re.compile("(?:[^_]*?_)?(\d*)(?:[^0-9])?")
#SampleNodenames
nodeNames  = ["E1_40873886", "E2_40873886", "40873886", "40873886-A", "40873886-B"] 
for nodeName in nodeNames:
    result = regex.match(nodeName)
    print result.group(1)

答案 1 :(得分:1)

你可以str.translate只保留数字,在_上的splittin将给你一个字符串或只是_之后的子字符串,在那里你可以删除任何尾随 - 或大写字母:< / p>

from string import ascii_uppercase
nodeName.split("_")[-1].translate(None,ascii_uppercase+"-")

输出:

In [44]: nodeName = "E1_40873886"

In [45]: nodeName.split("_")[-1].translate(None,ascii_uppercase+"-")
Out[45]: '40873886'

In [46]: nodeName = "40873886-B"

In [47]: nodeName.split("_")[-1].translate(None,ascii_uppercase+"-")
Out[47]: '40873886'

In [48]: nodeName = "40873886"

In [49]: nodeName.split("_")[-1].translate(None,ascii_uppercase+"-")
Out[49]: '40873886'

你也可以rstrip而不是翻译:

nodeName.split("_")[-1].rstrip(ascii_uppercase+"-")

如果您总是有8个连续数字,您也可以使用简单的正则表达式:

import  re
s = "E2_40873886"
print(re.search("\d{8}",nodeName).group())