Извлекайте подстроки отдельно от строки, используя регулярное выражение Python - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь написать регулярное выражение, которое возвращает часть подстроки, которая находится после строки.Например: я хочу получить часть подстроки вместе с пробелами, которые находятся после "15/08/2017".

a='''S
LINC             SHORT LEGAL                                   TITLE NUMBER
0037 471 661     1720278;16;21                                 172 211 342

LEGAL DESCRIPTION
PLAN 1720278  
BLOCK 16  
LOT 21  
EXCEPTING THEREOUT ALL MINES AND MINERALS  

ESTATE: FEE SIMPLE  
ATS REFERENCE: 4;24;54;2;SW

MUNICIPALITY: CITY OF EDMONTON

REFERENCE NUMBER: 172 023 641 +71

---------------------------------------------------------------------------- 
----
             REGISTERED OWNER(S)
REGISTRATION    DATE(DMY)  DOCUMENT TYPE      VALUE           CONSIDERATION
--------------------------------------------------------------------------- 
-- 
---

172 211 342    15/08/2017  AFFIDAVIT OF                       CASH & MTGE'''

Есть ли способ получить 'AFFIDAVIT OF' и 'CASH & MTGE' как отдельные строки?

Вот выражение, которое я сложил до сих пор:

doc = (a.split('15/08/2017', 1)[1]).strip()
'AFFIDAVIT OF                       CASH & MTGE'

Ответы [ 11 ]

0 голосов
/ 31 декабря 2018

Мы можем попробовать использовать re.findall со следующим шаблоном:

PHASED OF ((?!\bCONDOMINIUM PLAN).)*)(?=CONDOMINIUM PLAN)

При поиске в многострочном режиме и режиме DOTALL приведенный выше шаблон будет соответствовать всему, что происходит между PHASED OF до, но не включая CONDOMINIUM PLAN.

input = "182 246 612    01/10/2018  PHASED OF                           CASH & MTGE\n        CONDOMINIUM PLAN"
result = re.findall(r'PHASED OF (((?!\bCONDOMINIUM PLAN).)*)(?=CONDOMINIUM PLAN)', input, re.DOTALL|re.MULTILINE)
output = result[0][0].strip()
print(output)

CASH & MTGE

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

0 голосов
/ 31 декабря 2018

Ваша проблема в том, что ваша строка отформатирована так, как она есть.Строка, которую вы ищете:

182 246 612 01/10/2018 PHASED OF CASH & MTGE

И затем вы ищете то, что когда-либо будет после 'PHASED OF' и некоторые пробелы.

Вы хотите найтидля

(? <= PHASED OF) \ s * (? P. *?) \ n </p>

в вашей строке.Это вернет объект соответствия, содержащий значение, которое вы ищете в группе value.

m = re.search(r'(?<=PHASED OF)\s*(?P<your_text>.*?)\n', a)
your_desired_text = m.group('your_text')

Кроме того: Есть много хороших онлайн-тестеров регулярных выражений, которые возятся с вашими регулярными выражениями.И только после завершения регулярного выражения просто скопируйте и вставьте его в python.

Я использую это: https://regex101.com/

0 голосов
/ 26 декабря 2018

re фрагмент кода на основе

import re
foo = '''S
LINC             SHORT LEGAL                                   TITLE NUMBER
0037 471 661     1720278;16;21                                 172 211 342

LEGAL DESCRIPTION
PLAN 1720278
BLOCK 16
LOT 21
EXCEPTING THEREOUT ALL MINES AND MINERALS

ESTATE: FEE SIMPLE
ATS REFERENCE: 4;24;54;2;SW

MUNICIPALITY: CITY OF EDMONTON

REFERENCE NUMBER: 172 023 641 +71

----------------------------------------------------------------------------
----
             REGISTERED OWNER(S)
REGISTRATION    DATE(DMY)  DOCUMENT TYPE      VALUE           CONSIDERATION
---------------------------------------------------------------------------
--
---

172 211 342    15/08/2017  AFFIDAVIT OF                       CASH & MTGE'''

pattern = '.*\d{2}/\d{2}/\d{4}\s+(\w+\s+\w+)\s+(\w+\s+.*\s+\w+)'
result = re.findall(pattern, foo, re.MULTILINE)
print "1st match: ", result[0][0]
print "2nd match: ", result[0][1]

Выход

1st match:  AFFIDAVIT OF
2nd match:  CASH & MTGE
0 голосов
/ 26 декабря 2018

положительный взгляд за утверждением **

 m=re.search('(?<=15/08/2017).*', a)
 m.group(0)
0 голосов
/ 21 декабря 2018

Исходя из вашего выражения, я считаю, что вам нужно:

import re

a='172 211 342    15/08/2017  TRANSFER OF LAND   $610,000        CASH & MTGE'
re.match("(.*?)(\w+/)",a).group(1)

Вывод:

'172 211 342    '
0 голосов
/ 26 декабря 2018

Не основано на регулярных выражениях.Но делает трюк.

a='''S
LINC             SHORT LEGAL                                   TITLE NUMBER
0037 471 661     1720278;16;21                                 172 211 342

LEGAL DESCRIPTION
PLAN 1720278  
BLOCK 16  
LOT 21  
EXCEPTING THEREOUT ALL MINES AND MINERALS  

ESTATE: FEE SIMPLE  
ATS REFERENCE: 4;24;54;2;SW

MUNICIPALITY: CITY OF EDMONTON

REFERENCE NUMBER: 172 023 641 +71

---------------------------------------------------------------------------- 
----
            REGISTERED OWNER(S)
REGISTRATION    DATE(DMY)  DOCUMENT TYPE      VALUE           CONSIDERATION
--------------------------------------------------------------------------- 
-- 
---

172 211 342    15/08/2017  AFFIDAVIT OF                       CASH & MTGE'''

doc = (a.split('15/08/2017', 1)[1]).strip() 
# used split with two white spaces instead of one to get the desired result
print(doc.split("  ")[0].strip()) # outputs AFFIDAVIT OF
print(doc.split("  ")[-1].strip()) # outputs CASH & MTGE

Надеюсь, это поможет.

0 голосов
/ 21 декабря 2018

Почему регулярные выражения?

Похоже, вы знаете точную строку-разделитель, просто str.split() по ней и получаете первую часть:

In [1]: a='172 211 342    15/08/2017  TRANSFER OF LAND   $610,000        CASH & MTGE'

In [2]: a.split("15/08/2017", 1)[0]
Out[2]: '172 211 342    '
0 голосов
/ 21 декабря 2018

Вы должны использовать группу (1)

import re
re.match("(.*?)15/08/2017",a).group(1)

Выход

'172 211 342    '
0 голосов
/ 21 декабря 2018

Я бы не стал использовать здесь регулярное выражение, потому что единственным значимым разделением между логическими терминами является 2 или более пробелов.Отдельные термины, включая тот, который вы хотите сопоставить, также могут содержать пробелы.Итак, я рекомендую сделать регулярное выражение на входе, используя \s{2,} в качестве шаблона.Это даст список, содержащий все условия.Затем мы можем просто пройтись по списку один раз, и когда мы найдем перспективный термин, мы можем вернуть предыдущий термин в списке.

import re
a = "172 211 342    15/08/2017  TRANSFER OF LAND   $610,000        CASH & MTGE"
parts = re.compile("\s{2,}").split(a)
print(parts)

for i in range(1, len(parts)):
    if (parts[i] == "15/08/2017"):
        print(parts[i-1])

['172 211 342', '15/08/2017', 'TRANSFER OF LAND', '$610,000', 'CASH & MTGE']
172 211 342
0 голосов
/ 21 декабря 2018

Вы должны вернуть нужную группу:

re.match("(.*?)15/08/2017",a).group(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...