Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python正则表达式分别从字符串中提取子字符串_Python_Regex_Python 3.x - Fatal编程技术网

使用python正则表达式分别从字符串中提取子字符串

使用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而不是.

我试图编写一个正则表达式,它返回字符串后面的子字符串的一部分。例如:我想得到子字符串的一部分以及“2017年8月15日”之后的空格

有没有办法将
'宣誓书'
'现金和抵押贷款'
作为单独的字符串获取

以下是我到目前为止拼凑的表达:

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')