Как найти следующие 9 символов после строки, игнорирующей специальные символы? - PullRequest
0 голосов
/ 26 апреля 2019

Рассмотрим следующую строку:

str_test = 'This is a sample text NRC234456789 and this is another case AZN.1.Z.3.4.S.6.7.8.9 and this another case BSA 123 456 789 and final case SSR/789456123'

По сути, мне нужно найти места в строке, где находятся символы «NRC», «AZN», «BSA» и «SSR». Затем мне нужно извлечь следующие 9 чисел .. игнорируя любой не числовой символ. Так должно получиться

В некоторых случаях число 5 записывается неправильно как S, а число 2 записывается как Z. Мне все еще нужно идентифицировать эти случаи и изменить неправильные S и Z на 5 и 2 соответственно.

result = ['NRC234456789', 'AZN123456789' , 'BSA123456789', 'SSR789456123']

У меня есть этот код, с которым я работаю

list_comb = ['NRC', 'AZN', 'BSA', 'SSR'] 
def findWholeWord(w): 
    return re.compile(r'\b({0})\b'.format(w), flags=re.IGNORECASE).search 

Возвращает позицию, в которой находятся строки ... но я не уверен, что делать дальше. Спасибо

Ответы [ 3 ]

0 голосов
/ 26 апреля 2019

Это один подход

Пример:

import re

str_test = 'This is a sample text NRC234456789 and this is another case AZN.1.2.3.4.5.6.7.8.9 and this another case BSA 123 456 789 and final case SSR/789456123'
to_check = ['NRC', 'AZN', 'BSA', 'SSR']
pattern = re.compile("("+"|".join(to_check) + ")([\d+\.\s\/]+)")

for k, v in pattern.findall(str_test):
    print(k + re.sub(r"[^\d]", "", v))

Выход:

NRC234456789
AZN123456789
BSA123456789
SSR789456123

Редактировать согласно комментарию.

import re

str_test = 'This is a sample text NRC234456789 and this is another case AZN.1.Z.3.4.S.6.7.8.9 and this another case BSA 123 456 789 and final case SSR/789456123'
to_check = ['NRC', 'AZN', 'BSA', 'SSR']
pattern = re.compile("("+"|".join(to_check) + ")([\d+\.\s\/ZS]+)")

for k, v in pattern.findall(str_test):
    new_val = k + re.sub(r"[^\d]", "", v.replace("Z", "2").replace("S", "5"))
    print(new_val)
0 голосов
/ 26 апреля 2019

Вот простой подход, чтобы сначала найти нужный текст, используя это регулярное выражение,

\b(?:NRC|AZN|BSA|SSR)(?:.?\d)+

генерируется динамически с использованием предоставленного списка, а затем удаляет из него все не алфавитно-цифровые символы.

Edit: Для обработки ошибочных строк, где 2 ошибочно записано как Z, а 5 записано как S, вы можете заменить их во второй части строки, игнорируя начальные три символа. Кроме того, код обновлен, поэтому он выбирает только следующие девять цифр, а не больше. Вот мой обновленный код Python для того же,

import re

s = 'This is a sample text NRC234456789 and this is another case AZN.1.Z.3.4.S.6.7.8.9 and this another case BSA 123 456 789 and BSA 123 456 789 123 456 final case SSR/789456123'

list_comb = ['NRC', 'AZN', 'BSA', 'SSR']
regex = r'\b(?:{})(?:.?[\dA-Z])+'.format('|'.join(list_comb))
print(regex)

for m in re.findall(regex, s):
 m = re.sub(r'[^a-zA-Z0-9]+', '', m)
 mat = re.search(r'^(.{3})(.{9})', m)
 if mat:
  s1 = mat.group(1)
  s2 = mat.group(2).replace('S','5').replace('Z','2')
  print(s1+s2)

Печатает исправленное значение, где S заменяется на 5 и Z на 2,

NRC234456789
AZN123456789
BSA123456789
BSA123456789
SSR789456123
0 голосов
/ 26 апреля 2019

Используйте это regex для распознавания шаблона.Может быть, это может помочь:

import re

str_test = 'This is a sample text NRC234456789 and this is another case AZN.1.2.3.4.5.6.7.8.9 and this another case BSA 123 456 789 and final case SSR/789456123'
regex = re.findall("([A-Z0-9.\s\/]{2,})",str_test)
result = []

Одно решение, если нецифровые символы только точка, запятая и косая черта:

for r in regex:
    result.append(r.replace(".","").replace(" ","").replace("/",""))
print (result)

Или используйте этот цикл, если нецифровый символ может быть любым:

for r in regex:
    result.append(re.sub("([^\d\w])","",r))
print (result)

Вывод:

['NRC234456789', 'AZN123456789', 'BSA123456789', 'SSR789456123']

ОБНОВЛЕНИЕ

import re

str_test = 'This is a sample text NRC234456789 and this is another case AZN.1.Z.3.4.S.6.7.8.9 and this another case BSA 123 456 789 and final case SSR/789456123'
regex = re.findall("([A-Z]{3})([A-Z0-9.\s\/]{2,})",str_test)
result = []
for r in regex:
    result.append(r[0]+("".join(re.sub("([^\d\w])","",str(r[1])).replace("Z","2").replace("S","5"))))

print (result)

Вывод:

['NRC234456789', 'AZN123456789', 'BSA123456789', 'SSR789456123']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...