我正在尝试编写一个正则表达式,该表达式返回字符串后面的子字符串的一部分。例如:我想获得子字符串的一部分以及“ 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'
答案 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)
看起来您知道确切的定界字符串,只需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/