我有一个与正则表达式相关的问题。如果我有一个变量名 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。
答案 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())