Как разбить строку по слову / номеру и символу справа - PullRequest
2 голосов
/ 16 марта 2019

Я пытаюсь разбить строку, которая может выглядеть следующим образом:

A Fool (SEVEN000) (and His Money are S00n) Parted 

В: A Fool (7000) (and His Money are и S00n) Parted с использованием Python

) всегда будет присутствовать в конце строки, и ему всегда будет предшествовать слово / число. Я думал, что разделение его справа, используя шаблон [word/number]), сработает.

Редактировать:

Как и просили, вот еще несколько примеров

Right (Out of the) Gate 

Ожидаемый результат: Right (Out of the) Gate

Right (Out) (of the Gate at 12PM)

Ожидаемый результат: Right (Out of the Gate at 12PM)

Ответы [ 5 ]

2 голосов
/ 16 марта 2019

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

 (?=[^()]*\))(?=\S*\))

Демо

Проверьте этот код Python,

import re

s = 'A Fool (SEVEN000) (and His Money are S00n) Parted'
arr = re.split(r' (?=[^()]*\))(?=\S*\))', s)
print(arr)

Отпечатки какВы хотели,

['A Fool (SEVEN000) (and His Money are', 'S00n) Parted']
1 голос
/ 16 марта 2019

Вот один вариант, использующий re.split с положительным прогнозом.Шаблон, который я использую:

\s+(?=\w+\)(?:\s|$))

Этот шаблон говорит, что нужно разделить и использовать любое количество пробелов, когда ниже следует один или несколько символов слова, за которыми следует закрывающая скобка и пробел или конецвход.

input = "A Fool (SEVEN000) (and His Money are S00n) Parted"
parts = re.split(r'\s+(?=\w+\)(?:\s|$))', input)
print(parts)

['A Fool (SEVEN000) (and His Money are', 'S00n) Parted']
0 голосов
/ 16 марта 2019

Если разделитель является только пробелом, мы можем сделать это без регулярных выражений.Может быть так, используя rfind():

def splitter(a_string):
    idx1 = a_string.rfind(')')
    idx2 = a_string.rfind(' ', 0, idx1)
    idx3 = a_string.rfind('(', 0, idx1)
    if (idx2 > -1) and (idx3 < idx2):
         return (a_string[:idx2], a_string[idx2:])
    else:
         return None

splitter('Right (Out) (of the Gate at 12PM)')

output: ('Right (Out) (of the Gate at', ' 12PM)')

splitter('Right (Out)')

output: None   
0 голосов
/ 16 марта 2019

Я бы сделал это следующим образом:

import re
text = 'A Fool (SEVEN000) (and His Money are S00n) Parted'
parted = re.findall(r'(.+)\s+(\S+\)[^\)]*$)',text)[0]
print(parted)

Вывод имеет следующий кортеж:

('A Fool (SEVEN000) (and His Money are', 'S00n) Parted')

Чтобы понять мое регулярное выражение, оно может быть разбито на:

1-я группа: .+

разделитель: \s+

2-я группа: \S+\)[^\)]*$

Соответствие первой группе не менее 1 символы не являются символом новой строки \n, разделитель соответствует по крайней мере 1 символу пробела (это означает не только пробел, но и возврат каретки \r, символ табуляции \t и т. Д.), Наконец, но самое главное, вторая группа состоит как минимум из одного непробеласимвол, за которым следует ), за которым следует 0 или более not- ) (т.е. любой символ, который не является )), который простирается до конца строки, как обозначено $.Если вы хотите использовать только пробелы вместо пробельных символов, замените \s на (пробел) и \S на [^ ]

0 голосов
/ 16 марта 2019

Используйте следующее регулярное выражение и подстроку в индексе:

\b[A-Za-z0-9]+\) [A-Za-z0-9]+$

(предполагается, что после закрывающей скобки есть только одно слово, вам нужно будет предоставить больше информации, чтобы я мог обновитьответ, если это не так)

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