我对Python还是很陌生,因此找不到通过谷歌搜索或在此处搜索来找出答案的措辞。我试图用Python编写一行代码以从电子邮件主题行中提取一定数量的代码。我正在将电子邮件的数据读取到Panda数据框中(列由主题,收件人,发件人等分隔)。该数字将始终位于同一位置,但长度会有所不同(最少4个,最多9个)。
例如:
Email Subject Line: 'No, I will submit changes: Action Required: RIC
CR 2.6.7.1-5 - Active Confirmation - Affected: Doe, John 012345 - Date
Sent: 01-02-2019'
预期结果:012345
我认为最好的方法是在倒数第二个和最后一个“-”之间输入字符串(即,受影响的是:Doe,John 123456)。一旦有了它,然后从该子字符串中提取123456。但是,如前所述,该数字的长度可以在4-9之间变化。就像在示例中一样,有时该数字的前导零,而我将需要这个数字不下降。最重要的是,名称显然也会有所不同。
这有可能吗?
我仅尝试对字符串进行切片,但是我觉得这不可避免地会变成if
-else
场景的噩梦。
sixdigitnumber = df.subject[0][-30:][:6].strip()
我收到了预期的结果,但是我觉得有一种更聪明或更“ pythonic”的方式来做到这一点。请让我知道是否可以详细说明!
更新#1:
我也尝试过正则表达式,但不确定这是否仍然是最佳途径? 办法。
例如:
import re
regexpression= re.search('Manager: (.*) -', df.subject[0])
result = regexpression.group(1).rsplit(' ', 1)[1]
print (f'{result}')
答案 0 :(得分:0)
string = '''Email Subject Line: 'No, I will submit changes: Action Required: RIC
CR 2.6.7.1-5 - Active Confirmation - Affected: Doe, John 012345 - Date
Sent: 01-02-2019'''
stringlist = string.split('-')
answer = stringlist[-4].strip()[-6:]
print (answer)
#012345
此答案假定您的标题格式始终相同。它将寻找'-'
作为分割条件并以此分割。然后它将从后列表元素中查找第4位,并获取最后6位数字。
或者,
stringlist = string.split('-')
affectedlist = stringlist[-4].split()
anydigitnumber = affectedlist[-1]
print (anydigitnumber)
#012345
这也可以工作,它将在John 012345
的最后部分为您获取任意数量的数字
答案 1 :(得分:0)
使用 isdigit()
s = "Email Subject Line: 'No, I will submit changes: Action Required: RIC
CR 2.6.7.1-5 - Active Confirmation - Affected: Doe, John 012345 - Date
Sent: 01-02-2019'"
使用-1的前提是始终处于同一位置
如果您想要前导零,那么将使用字符串:
print([a for a in s.split() if a.isdigit()][-1])
答案 2 :(得分:0)
import re
x= 'No, I will submit changes: Action Required: RIC CR 2.6.7.1-5 - Active Confirmation - Affected: Doe, John 012345 - Date Sent: 01-02-2019'
numbers=re.findall("(.*?)-",x)
for i in range(len(numbers[3])):
if numbers[3][i].isdigit() is True:
print (numbers[3][i:])
break
如果该模式与您提供的示例一致(搜索“-”以分割文本,然后搜索您的数字)
答案 3 :(得分:0)
您可以将破折号分隔成一个用空格括起来的破折号(而不是一个破折号),然后可以更轻松地找到要查找的内容,即倒数第二个“ element”的最后一个“ word” :
string = '''Email Subject Line: 'No, I will submit changes: Action Required: RIC
CR 2.6.7.1-5 - Active Confirmation - Affected: Doe, John 012345 - Date
Sent: 01-02-2019'''
# first-to-last element (count backward from -1)
affected = string.split(' - ')[-2]
# last "word" (split assumes space/tab if nothing is provided)
number = affected.split()[-1]
如果您需要数字而不是字符串,只需用int
换行:
number = int(affected.split()[-1])
请注意,这将适用于任何长度的数字(以及任何长度/单词数的前缀名称),只要结构得以保留。
答案 4 :(得分:0)
>>> import re
>>> s="""Email Subject Line: 'No, I will submit changes: Action Required: RIC
... CR 2.6.7.1-5 - Active Confirmation - Affected: Doe, John 012345 - Date
... Sent: 01-02-2019'"""
>>> m=re.search(r'\b[0-9]{4,9}\b',s)
>>> m.group(0)
'012345'
使用\ b表示单词边界,以避免意外匹配