使用python正则表达式分别从字符串中提取子字符串
我试图编写一个正则表达式,它返回字符串后面的子字符串的一部分。例如:我想得到子字符串的一部分以及“2017年8月15日”之后的空格 有没有办法将使用python正则表达式分别从字符串中提取子字符串,python,regex,python-3.x,Python,Regex,Python 3.x,我试图编写一个正则表达式,它返回字符串后面的子字符串的一部分。例如:我想得到子字符串的一部分以及“2017年8月15日”之后的空格 有没有办法将'宣誓书'和'现金和抵押贷款'作为单独的字符串获取 以下是我到目前为止拼凑的表达: doc = (a.split('15/08/2017', 1)[1]).strip() 'AFFIDAVIT OF CASH & MTGE' 您可以使用组(1) 更新 对于更新的字符串,您可以使用.search而不是.
'宣誓书'
和'现金和抵押贷款'
作为单独的字符串获取
以下是我到目前为止拼凑的表达:
doc = (a.split('15/08/2017', 1)[1]).strip()
'AFFIDAVIT OF CASH & MTGE'
您可以使用
组(1)
更新
对于更新的字符串,您可以使用.search
而不是.match
re.search("(.*?)15\/08\/2017",a).group(1)
您必须返回正确的组:
re.match("(.*?)15/08/2017",a).group(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
您需要使用组(1)
输出
'172 211 342 '
看起来您知道确切的分隔字符串,只需通过它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 '
基于您的表情,我相信您需要:
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 '
不是基于正则表达式的解决方案。但它确实起了作用
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
希望能有帮助 基于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
输出
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
*
m=re.search(”(?我们可以尝试使用以下模式使用re.findall
:
PHASED OF ((?!\bCONDOMINIUM PLAN).)*)(?=CONDOMINIUM PLAN)
在多行和DOTALL模式下搜索时,上述模式将匹配在<代码>分阶段的<代码>到<代码>共管计划代码>之间发生的所有情况
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
请注意,我还从匹配中去掉了空格。我们可能可以修改regex模式来实现这一点,但在一般的解决方案中,在某些情况下,您可能希望保留一些空格。您的问题是字符串的格式是这样的。
你要找的线路是
182 246 612 2018年10月1日现金和MTGE分期付款
然后你要寻找在“分阶段的”和一些空间之后会出现什么
您要搜索
(?如果2017年8月15日15
之前有多个术语,这将给出不正确的结果。我已经编辑了我的输入字符串。现在编辑的字符串不起作用。如果所需术语不是第一个术语,这将完全失败。我已经使用实际输入字符串进行了编辑。是否仍然可以使用regex执行此操作?为什么你想用regex来做这件事吗?你愿意接受任何其他解决方案吗?是的,如果有比regexIt更好的方法对我编辑过的输入字符串不起作用的话now@Farook在这种情况下,它不会,对吧。你可以调整解决方案并首先在换行符上拆分它,但在这种情况下,正则表达式可以一次性完成ING是文档类型下面的字符串,可以是多行的,不一定是多行的。如果它是多行的,它应该考虑它。我的答案涵盖了多行的情况。如果你看到我的答案中的一个缺陷,然后确切地指出它是什么。我不能告诉你这个结果是什么。(?=公寓平面图),输入,关于DOTALL |关于多行)。我们不能将“分阶段公寓计划”作为一个词吗?不,我们不能,因此我最初在你的问题下评论说没有答案。你需要跨行匹配。好吧,好吧,如果日期后没有多行词,那么需要做什么修改?我不是在搜索“分阶段公寓计划”和一些之后的内容空格。相反,我正在搜索文件类型(即“分阶段公寓计划”)下整个单词后的字符串。我需要获取“分阶段公寓计划”后的字符串,该字符串应返回“现金和MTGE”,我尝试使用下面的表达式。我哪里出错了?
PHASED OF ((?!\bCONDOMINIUM PLAN).)*)(?=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
m = re.search(r'(?<=PHASED OF)\s*(?P<your_text>.*?)\n', a)
your_desired_text = m.group('your_text')