#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*)
(?:s|^)
соответствует пробелу или началу строки(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
) заключается также в совпадении в начале строки и в конце строки.