2013-06-16 7 views
2

В настоящее время я работаю над ботом python, который извлекает информацию из метаблока на HTML-странице. Я получаю содержимое метаблока, и теперь я застрял в попытке разобрать его на две разные строки.Попытка разобрать строку на две отдельные строки на основе case

Пример содержания будет:

Lowercase Words WITH UPPERCASE CONTAINING 2 AND ALSO ', AND MANY MORE CHARACTERS 

До сих пор у меня есть:

lowercase = ' '.join(w for w in content.split() if (not w.isupper()) and (not w.isdigit())) 
uppercase = ' '.join(w for w in content.split() if (w.isupper() or w.isdigit())) 

где прописная строка предназначена, чтобы содержать все, что не слово «Строчный» или «Слова»

Мне не удалось найти много помощи в этом вопросе, и мне было интересно, знает ли кто-нибудь об этом трюке или о работе? Спасибо

ответ

0

Почему бы не использовать regular expressions:

import re 

s = "Lowercase Words WITH UPPERCASE CONTAINING 2 AND ALSO ', AND MANY MORE CHARACTERS" 
match = re.match(r"(([^\s]*[a-z]+[^\s]*\s+)+)([^a-z]+)", s) 
if match: 
    lowercase = match.group(1) 
    uppercase = match.group(3) 

Это будет соответствовать одной строки строки, начиная с произвольного числа слов из которых каждый должен содержать по меньшей мере, одну строчную букву (a-z). Обратите внимание, что верблюжий чехол также распознается как строчная строка (например, "LowerCase"). Вторая часть будет соответствовать остальной части строки, которая не должна содержать никаких строчных букв.

Давайте попробуем понять, регулярное выражение в настоящее время:

  1. Мы хотим, чтобы соответствовать строчные слова, поэтому мы пишем: [a-z]+
    Но это будет соответствовать только слова, которые полностью состоящие из строчных букв - мы хотите также разрешить другие символы и сопоставить слово в нижнем регистре, если оно содержит хотя бы один символ. [^\s] будет соответствовать любому символу, который не является белым (граница слова). Мы объединяем оба шаблона следующим образом: [^\s]*[a-z]+[^\s]*.
    Это соответствует любому количеству символов без пробелов (равно нулю), за которыми следуют строчные символы, а затем повторяется любая последовательность символов без пробелов. Таким образом, это в основном означает, что мы сопоставляем любую последовательность, которая не содержит пробелов и, по крайней мере, одну строчную букву.
    Теперь мы делаем последовательность таких слов, разделенных пробелами: ([^\s]*[a-z]+[^\s]*\s+)+
  2. Соответствие верхней части корпуса довольно прямолинейно, потому что нам нужно только сопоставить все (включая пробелы), которое не является строчным символом: [^a-z]+

для того, чтобы матчи обеих моделей доступны через группы, мы оборачиваем им, в фигурных скобках снова:
в нижнем регистре: (([^\s]*[a-z]+[^\s]*\s+)+)
прописные: ([^a-z]+)

Возможно, вам необходимо настроить шаблон Furt она, в соответствии с вашими потребностями, но я считаю, что это должно быть хорошей отправной точкой ...

+0

Большое спасибо, Александр! Этот пост работал превосходно, с удивительно простым решением и красиво обработанным объяснением. Именно то, что я искал. – Redback93

0

Что-то вроде этого?

>>> from string import punctuation as punc 
def ispunc(strs): 
    return all(x in punc for x in strs) 
... 
>>> strs = "Lowercase Words WITH UPPERCASE CONTAINING 2 AND ALSO ', AND MANY MORE CHARACTERS" 
>>> ' '.join(w for w in strs.split() if (w.isupper() or w.isdigit() or ispunc(w)))   
"WITH UPPERCASE CONTAINING 2 AND ALSO ', AND MANY MORE CHARACTERS" 

>>> ' '.join(w for w in strs.split() if (not w.isupper()) and (not w.isdigit() and not ispunc(w)))   
'Lowercase Words' 
>>> 
Смежные вопросы