Пробел следует в скобках (не ленивый) в Python с использованием регулярных выражений - PullRequest
1 голос
/ 13 апреля 2020

Я пытаюсь сделать следующее: из списка строк извлечь что-либо до первого появления (может быть более одного) пробела, за которым следует круглая скобка "(".

У меня есть пробовал следующее:

re.findall("(.*)\s\(", line))

, но он дает результаты для следующих строк:

Carrollton (Университет Западной Джорджии) [2] * Dahlonega (Колледж Северной Георгии) И государственный университет) [2]

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Чтобы извлечь что-либо до первого появления символа пробела, за которым следует круглая скобка (, вы можете использовать re.search (этот метод предназначен только для извлечения первого совпадения):

re.search(r'^(.*?)\s\(', text, re.S).group(1)
re.search(r'^\S*(?:\s(?!\()\S*)*', text).group()

См. Демонстрационные примеры regex # 1 и regex # 2 . Обратите внимание, что второй, хотя и более длинный, гораздо эффективнее, поскольку он следует принципу unroll-the-l oop .

Подробности

  • ^ - начало строки
  • (.*?) - Группа 1: любые 0+ символов, как можно меньше ,
  • \s\( - пробел и ( char.

Или, лучше:

  • ^\S* - начало строки и затем 0+ непробельных символов
  • (?:\s(?!\()\S*)* - 0 или более вхождений
    • \s(?!\() - символ пробела не сопровождается (
    • \S* - 0+ непробельных символов

См. Python демо :

import re
strs = ['Isla Vista (University of California, Santa Barbara)[2]','Carrollton (University of West Georgia)[2]','Dahlonega (North Georgia College & State University)[2]']
rx = re.compile(r'^\S*(?:\s(?!\()\S*)*', re.S)
for s in strs:
    m = rx.search(s) 
    if m:
        print('{} => {}'.format(s, m.group()))
    else:
        print("{}: No match!".format(s))
1 голос
/ 13 апреля 2020

Вы можете использовать Lookahead для этого. Попробуйте это регулярное выражение:

[a-z A-Z]+(?=[ ]+[\(]+)
...