Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用regex按顺序匹配多个单词

使用regex按顺序匹配多个单词
EN

Stack Overflow用户
提问于 2020-01-05 06:28:51
回答 4查看 302关注 0票数 0

我正在尝试创建一个函数,该函数将根据以下条件从文本返回字符串:

  1. 如果字符串中的“定期付款授权”,在“on”之后获得第一条文本。
  2. 如果字符串中有“定期支付”,则在此之前获取所有内容。

目前,我写了以下几篇文章:

代码语言:javascript
运行
AI代码解释
复制
#will be used in an apply statement for a column in dataframe
def parser(x):
    x_list = x.split()
    if " recurring payment authorized on " in x and x_list[-1]!= "on":
         return x_list[x_list.index("on")+1]
     elif " recurring payment" in x:
         return ' '.join(x_list[:x_list.index("recurring")])
     else:
         return None

但是,这段代码看起来很笨拙,而且不健壮。我想使用regex来匹配这些字符串。

下面是这个函数应该返回的一些示例:

  1. recurring payment authorized on usps abc应该返回usps
  2. usps recurring payment abc应该返回usps

对于编写此函数的正则表达式的任何帮助都将不胜感激。输入字符串将只包含文本;不存在数字字符和特殊字符。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-01-05 07:25:01

使用Regex与前瞻和后视模式匹配

代码语言:javascript
运行
AI代码解释
复制
import re

def parser(x):
    # Patterns to search
    pattern_on = re.compile(r'(?<= authorized on )(.*?)(\s+)')
    pattern_recur = re.compile(r'^(.*?)\s(?=recurring payment)')

    m = pattern_on.search(t)
    if m:
        return m.group(0)

    m = pattern_recur.search(t)
    if m:
        return m.group(0)

    return None

tests =  ["recurring payment authorized on usps abc", "usps recurring payment abc", "recurring payment authorized on att xxx xxx", "recurring payment authorized on 25.05.1980 xxx xxx", "att recurring payment xxxxx", "12.14.14. att recurring payment xxxxx"]


for t in tests:
    found = parser(t)
    if found:
        print("In text: {}\n Found: {}".format(t, found))

输出

代码语言:javascript
运行
AI代码解释
复制
In text: recurring payment authorized on usps abc
 Found: usps 
In text: usps recurring payment abc
 Found: usps 
In text: recurring payment authorized on att xxx xxx
 Found: att 
In text: recurring payment authorized on 25.05.1980 xxx xxx
 Found: 25.05.1980 
In text: att recurring payment xxxxx
 Found: att 
In text: 12.14.14. att recurring payment xxxxx
 Found: 12.14.14. att 

解释

前瞻和后视模式匹配

Regex向后看 (?<=foo)查找断言字符串中当前位置前面的是foo

所以在模式上: r'(?<=授权的)(.*?)(\s+)‘

代码语言:javascript
运行
AI代码解释
复制
foo is " authorized on "
(.*?) - matches any character (? causes it not to be greedy)
(\s+) - matches at least one whitespace

因此,上述原因(.*?)在“授权开始”之后捕获所有字符,直到第一个空白字符。

Regex展望 (?=foo)查找前断言字符串中当前位置后面紧跟的是foo

因此: r'^(.*?)\s(?=recurring支付)‘

代码语言:javascript
运行
AI代码解释
复制
foo is 'recurring payment'
^ - means at beginning of the string
(.*?) - matches any character (non-greedy)
\s - matches white space

因此,(.*?)将匹配字符串开头的所有字符,直到得到空格和“定期支付”为止。

更好的性能是可取的,因为您正在应用Dataframe,它可能有很多列。

将模式编译从解析器中取出并放在模块中(时间减少33%)。

代码语言:javascript
运行
AI代码解释
复制
def parser(x):
    # Use predined patterns (pattern_on, pattern_recur) from globals
    m = pattern_on.search(t)
    if m:
        return m.group(0)

    m = pattern_recur.search(t)
    if m:
        return m.group(0)

    return None

 # Define patterns to search
pattern_on = re.compile(r'(?<= authorized on )(.*?)(\s+)')
pattern_recur = re.compile(r'^(.*?)\s(?=recurring payment)')

tests =  ["recurring payment authorized on usps abc", "usps recurring payment abc", "recurring payment authorized on att xxx xxx", "recurring payment authorized on 25.05.1980 xxx xxx", "att recurring payment xxxxx", "12.14.14. att recurring payment xxxxx"]
票数 2
EN

Stack Overflow用户

发布于 2020-01-05 07:51:11

我不确定这种复杂程度是否需要RegEx。

希望RegEx不是对您的严格要求,这里有一个不使用它的解决方案:

代码语言:javascript
运行
AI代码解释
复制
examples = [
'stuff more stuff recurring payment authorized on ExampleA useless data',
'other useless data ExampleB recurring payment',
'Not matching phrase payment example authorized'
]


def extract_data(phrase):
    result = None
    if "recurring payment authorized on" in phrase:
        result = phrase.split("recurring payment authorized on")[1].split()[0]
    elif "recurring payment" in phrase:
        result = phrase.split("recurring payment")[0]
    return result


for example in examples:
    print(extract_data(example))

输出

代码语言:javascript
运行
AI代码解释
复制
ExampleA
other useless data ExampleB
None
票数 0
EN

Stack Overflow用户

发布于 2020-01-05 10:49:05

不确定这是否更快,但是Python有条件:

  • 如果authorized on存在,那么
    • 匹配其他非空格字符的下一个子字符串。
    • 匹配在recurring之前发生的一切

请注意,结果将在捕获组2或3取决于哪个匹配。

代码语言:javascript
运行
AI代码解释
复制
import re

def xstr(s):
    if s is None:
        return ''
    return str(s)

def parser(x):
    # Patterns to search
    pattern = re.compile(r"(authorized\son\s)?(?(1)(\S+)|(^.*) recurring)")

    m = pattern.search(t)
    if m:
        return xstr(m.group(2)) + xstr(m.group(3))

    return None

tests =  ["recurring payment authorized on usps abc", "usps recurring payment abc", "recurring payment authorized on att xxx xxx", "recurring payment authorized on 25.05.1980 xxx xxx", "att recurring payment xxxxx", "12.14.14. att recurring payment xxxxx"]


for t in tests:
    found = parser(t)
    if found:
        print("In text: {}\n Found: {}".format(t, found))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59600852

复制
相关文章
MySQL外键约束使用
在MySQL中,外键约束用于确保两个表之间的数据一致性。外键约束是一种限制,它将一个表中的列与另一个表中的列相关联。具体来说,它要求在一个表中的某个列中的值必须在另一个表的某个列中存在。外键约束可以确保数据的完整性和一致性,防止数据被删除或修改时发生错误。
堕落飞鸟
2023/05/11
4.3K0
SQLAlchemy外键的使用
orm可以将数据库存储的数据封装成对象,同时,如果封装的好的话,所有的数据库操作都可以封装到对象中。这样的代码在组织结构上会非常的清晰,并且相对与使用sql语句在sql注入方面会极具降低。 SQLAlchemy中的映射关系有四种,分别是一对多,多对一,一对一,多对多 实现这种映射关系只需要外键(ForeignKey),和relationship 一对多: from sqlalchemy.ext.declarative import declarative_base from sqlalchemy impor
用户1173509
2018/01/17
2.4K0
gorm指定外键和关联外键
一直分不清association_foreignkey和foreignkey的作用,此文总结一下
平凡的学生族
2019/12/24
6.9K0
gorm指定外键和关联外键
外键约束
外键约束 foreign key 外键约束的要求: 父表和字表必须使用相同的存储引擎,禁止使用临时表; 数据库引擎只能是InnoDB; 外键列和参照列必须具有相似的数据类型,数字的长度或者是否有符号必须一样,字符长度可以不不一样; 外键列和参照列必须创建索引,参照列没有索引,mysql回自动创建索引; ----------- 下面创建两个数据表 1(父表)省份表两个字段 id (主键) 省份名称 2(子表)用户表三个字段 id (主键) 用户名称 省份编号(外键对应省表的主键id类型一样,因为需要把这个设
前朝楚水
2018/04/04
2.1K0
外键约束
     2.设置外键约束的两个表之间会有 父子关系 ,即字表中外键字段的取值范围 取决于 父表
全栈程序员站长
2022/09/06
1.7K0
明了 | MongoDB 外键的基本使用
而在MongoDB中,表示表关系,使用的是嵌套,即,一个文档嵌套一个文档的方法,作为MongoDB的两个文档的关联,以及使用,reference link作为文档和文档之间的关联。
mySoul
2020/07/22
1.9K0
每日一库:GORM 外键使用
在 GORM 中使用外键涉及到在结构体定义中指定外键关系以及数据库迁移时的操作。下面是一个使用 GORM 定义外键的示例:
孟斯特
2023/10/19
1.3K0
每日一库:GORM 外键使用
外键的设置
② 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立;
诡途
2022/05/09
2.8K0
外键的设置
Python面向对象编程-类和对象-对象的创建和使用
在Python中,对象是一种数据结构,它封装了数据和行为,并允许对它们进行操作。对象是根据类定义的,它们具有类定义的属性和方法。本文将介绍如何在Python中创建和使用对象。
玖叁叁
2023/04/19
1.2K0
mysql的外键
在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束。 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持); 2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立; 3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以; 外键的好处:可以使得两张表关联,保证数据的一致性
java达人
2018/01/31
5.6K0
MySQL外键约束
关系键是关系数据库的重要组成部分。关系键是一个表中的一个或几个属性,用来标识该表的每一行或与另一个表产生联系。 其中就包括外键
JavaEdge
2022/11/29
6.7K0
MySQL外键约束
Mysql外键约束
如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。外键主要用来保证数据的完整性和一致性 两个表必须是InnoDB表,MyISAM表暂时不支持外键 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立; 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如in
暖月寒星
2020/03/10
6K0
MySQL外键约束
外键其实很好理解,简单的说就是两张表建立一个连接关系。这里我们那主表A和副表B举例,我A表中有用户信息,B表中有用户订单信息。要是数据完整对应起来,肯定是需要把两张表关联起来,我们因此会在B表中村一个A表的字段,常见的我们存的是A表的主键ID外键。
兔云小新LM
2019/08/02
6.1K0
外键(FOREIGN KEY)
1、表的组织结构复杂不清晰 2、浪费空间 3、扩展性极差
全栈程序员站长
2022/09/07
9600
Oracle 数据库创建外键后禁用外键的方法
我们创建外键后,可能有时会遇到要禁用外键的情况,那么在Oracle中,我们如何对外键进行禁用呢?
用户8965210
2021/09/02
3.2K0
【说站】mysql使用foreign key创建外键
2、外键foreign key用于约束破坏表格的连接动作,保证两个表格的数据完整性。
很酷的站长
2022/11/23
1.3K0
MySQL外键使用详解--Java学习网
最近有开始做一个实验室管理系统,因为分了几个表进行存储・所以要维护表间的关联・・研究了一下MySQL的外键。
用户1289394
2021/07/09
9410
MySql---外键复习
其中:外键名为定义的外键约束的名称,一个表中不能有相同名称的外键;字段名表示子表被外健约束的字段名;主表名即被子表外键所依赖的表的名称;主键列表示主表中定义的主键列或者列组合。
大忽悠爱学习
2021/11/15
5.4K0
重温MySQL外键约束
1、父表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则父表与子表是同一个表,这样的表称为自参照表,这种结构称为自参照。 2、必须为父表定义主键。 3、主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。 4、外键中列的数目必须和父表的主键中列的数目相同。 5、外键中列的数据类型必须和父表主键中对应列的数据类型相同。说这么多比较笼统,还是看看例子吧。
AsiaYe
2019/11/06
6.5K0
三十四、外键约束
参照完整性要求关系中不允许引用不存在的实体。在 MySQL 中设置参照完整性的方式是使用 外键约束 。所谓外键就是用于在两个表中的数据之间建立和加强链接的一列或多列的组合,可控制可在外键表中存储的数据。例如,有学生表和分数表两个表,表内容如下。
喵叔
2021/06/29
1.9K0

相似问题

javascript JSON高级

23

JavaScript鼠标悬停

10

Javascript数组。高级

20

高级javascript指南

60

JavaScript、高级.replace()

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档