使用python正则表达式

时间:2018-12-26 03:54:27

标签: python regex python-3.x

我正在尝试编写一个正则表达式,该表达式返回字符串后面的子字符串的一部分。例如:我想获得子字符串的一部分以及“ 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 :(得分:3)

不是基于正则表达式的解决方案。但是,把戏。

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

希望有帮助。

答案 1 :(得分:3)

基于

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

答案 2 :(得分:3)

我们可以尝试通过以下模式使用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

请注意,我还从比赛中删除了空格。我们也许可以修改正则表达式模式来做到这一点,但是在一般解决方案中,在某些情况下,也许您想保留一些空白。

答案 3 :(得分:2)

Why regular expressions?

看起来您知道确切的定界字符串,只需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    '

答案 4 :(得分:1)

在这里我将避免使用正则表达式,因为逻辑项之间唯一有意义的分隔似乎是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

答案 5 :(得分:1)

positive lookbehind assertion* *

 m=re.search('(?<=15/08/2017).*', a)
 m.group(0)

答案 6 :(得分:0)

您可以使用group(1)

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

更新

对于更新后的字符串,您可以使用.search代替.match

re.search("(.*?)15\/08\/2017",a).group(1)

答案 7 :(得分:0)

您必须返回正确的组:


2018.12.21 05:24:46 LOG4[0]: CERT: Pre-verification error: certificate signature failure
2018.12.21 05:24:46 LOG4[0]: Rejected by CERT at depth=0: CN=down
2018.12.21 05:24:46 LOG7[0]: TLS alert (write): fatal: decrypt error
2018.12.21 05:24:46 LOG3[0]: error queue: 1417C086: error:1417C086:SSL routines:tls_process_client_certificate:certificate verify failed
2018.12.21 05:24:46 LOG3[0]: error queue: D0C5006: error:0D0C5006:asn1 encoding routines:ASN1_item_verify:EVP lib
2018.12.21 05:24:46 LOG3[0]: error queue: 4067072: error:04067072:rsa routines:rsa_ossl_public_decrypt:padding check failed
2018.12.21 05:24:46 LOG3[0]: SSL_accept: 407008A: error:0407008A:rsa routines:RSA_padding_check_PKCS1_type_1:invalid padding
2018.12.21 05:24:46 LOG5[0]: Connection reset: 0 byte(s) sent to TLS, 0 byte(s) sent to socket

答案 8 :(得分:0)

您需要使用group(1)

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

输出

'172 211 342    '

答案 9 :(得分:0)

以您的表情为基础,这是我认为您需要的:

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    '

答案 10 :(得分:0)

您的问题是,字符串的格式已更改。 您要寻找的线是

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

然后您正在寻找“ PHASED OF”之后的内容和一些空格。

您要搜索

  

(?<= PHASED OF)\ s *(?P。*?)\ n

在您的字符串中。这将返回一个匹配对象,其中包含您在value组中寻找的值。

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

此外:有许多优秀的在线正则表达式测试仪可以帮助您处理正则表达式。 并且只有在完成正则表达式后,才将其复制并粘贴到python中。

我使用这个:https://regex101.com/