如何从字符串的相同位置提取数值(长度可变)?

时间:2019-01-03 19:14:55

标签: python pandas dataframe data-cleaning

我对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}')

5 个答案:

答案 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表示单词边界,以避免意外匹配