регулярное выражение извлекает слово и заканчивается пробелом в строке

#python #regex

#python #регулярное выражение

Вопрос:

Я пытаюсь отфильтровать и извлечь одно слово из строки. Шаблон: GR.C.24 GRCACH GRALLDKD GR_3AD и т. Д

 input will be : the data is GRCACH got from server.

output : GRCAACH

problem : Pattern will start from GR<can be any thing> and end when whitespace encount
  

Я могу найти шаблон, но не могу закончить, когда возникает пробел.

код является:

 import re
fp_data = []
with open("output", "r") as fp:
    fp_data = fp.readlines()

for da in fp_data:
    match = re.search("sGR.*", da)
    print da
    if match:
        print dir(match)
        print match.group()

Output: GRCACH got from server

Excepted: GRCAACH (or possible word start with GR)
  

Комментарии:

1. .* соответствует всему, что следует, включая пробелы. [^s]* должно соответствовать чему угодно, КРОМЕ пробелов. Вы хотите сопоставить GR что-нибудь, кроме пробелов?

2. @LukasNeugebauer Все пробелы, кроме символа новой строки, если flags=re.DOTALL не указано иное.

3. можете ли вы отредактировать свой пост и показать нам, как должен выглядеть желаемый результат вашего скрипта? Из описания трудно сказать.

4. заканчивается, когда встречаются пробелы

Ответ №1:

Используйте:

 (?:s|^)(GRS*)
  
  1. (?:s|^) соответствует пробелу или началу строки
  2. (GRS*) соответствует GR, за которым следует 0 или более символов без пробелов, и места совпадают в группе 1

Нет необходимости считывать весь файл в память (что, если файл был очень большим?). Вы можете выполнять итерацию файла построчно.

 import re

with open("output", "r") as fp:
    for line in fp:
        matches = re.findall(r"(?:s|^)(GRS*)", line)
        print(line, matches)
  

Демонстрация регулярных выражений

Комментарии:

1. Но оно будет соответствовать только GR, но мне нужно также охватить GR.2.4. GCACCH GR_400 GR_AC

2. Perfect проведет некоторое тестирование

3. не думал, что S может быть полезным здесь

4. Я обновил ответ, потому что похоже, что вы на самом деле ищете слова, состоящие из GR, за которыми следуют альфа-символы (A … Z). Если в строке несколько таких слов, используйте findall .

5. необходимо также включить GR.A.C слово GR_ также. Короче говоря, любая вещь начинается с GR и заканчивается, когда найден пробел или новое слово

Ответ №2:

метод readlines() оставляет завершающий символ новой строки » n», поэтому я использовал понимание списка, чтобы удалить этот символ с помощью метода rstrip() и не работать с пустыми строками с помощью метода isspace ().

 import re
fp_data = []
with open("output", "r") as fp:
    fp_data =  [line.rstrip() for line in fp if not line.isspace()]

for line in fp_data:
    match = re.search("sGR.*", line)
    print(line) 
    if match:
        print(match)
        print(match.group())
  

Комментарии:

1. вы полностью изменили свой вопрос, так что теперь мой ответ выглядит неактуальным!

Ответ №3:

Не уверен, правильно ли я понял ваш ответ и вашу правку после моего вопроса о желаемом результате, но предполагая, что вы хотите перечислить все вхождения слов, которые начинаются с GR, вот предложение:

 import re
fp_data = []
with open("output", "r") as fp:
    fp_data = fp.readlines()

for da in fp_data:
    print da
    match = re.findall('\b(GR\S*)\b', da)
    if match:
        print match
  

Преимущество использования границ слов ( b ) заключается также в совпадении в начале строки и в конце строки.