Как вытащить числовое значение (изменяющееся по длине) из одной и той же позиции в строке? - PullRequest
0 голосов
/ 03 января 2019

Я довольно новичок в Python и не могу найти формулировку, чтобы выяснить это через поиск в Google или поиск здесь.Я пытаюсь написать строку кода на 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

То, что я считаю наилучшим маршрутом, - это взять строку между вторым, последним и последним '-' (т.е. Затронутый: Доу, Джон 123456).Как только я это получу, извлеките 123456 из этой подстроки.Но, как указывалось ранее, это число может варьироваться по длине от 4 до 9.Как и в примере, иногда это число имеет начальный ноль, и мне нужно, чтобы оно не падало.Кроме того, имя, очевидно, также будет различаться.

Возможно ли это?

Я только попытался нарезать строку, но я чувствую, что это неизбежно превратится вкошмар сценария if - else.

sixdigitnumber = df.subject[0][-30:][:6].strip()

Я получаю ожидаемый результат, но чувствую, что есть более умный или более «питонический» способ сделать это.Пожалуйста, дайте мне знать, если я мог бы уточнить еще!

Обновление № 1:

Я также пробовал регулярные выражения, но не уверен, что это все еще лучшемаршрут?путь.

Например:

import re
regexpression= re.search('Manager: (.*) -', df.subject[0])
result = regexpression.group(1).rsplit(' ', 1)[1]
print (f'{result}')

Ответы [ 5 ]

0 голосов
/ 03 января 2019
 >>> 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 для границ слов, чтобы избежать совпадения с чем-либо случайно

0 голосов
/ 03 января 2019

вы можете разделить тире, окруженную пробелами (в отличие от всего тире), и тогда будет легче найти то, что вы ищете, а именно последнее «слово» от первого до последнего «элемента» :

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])

обратите внимание, что это будет работать для чисел любой длины (а также для предшествующих имен любой длины / числа слов), если структура сохраняется.

0 голосов
/ 03 января 2019

use 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])
0 голосов
/ 03 января 2019
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

если шаблон соответствует приведенному вами примеру (поиск «-» для разделения текста, затем поиск ваших чисел)

0 голосов
/ 03 января 2019
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

...