繁体   English   中英

如何使用python(正则表达式)从字符串中提取像d1234-5678-c9876这样的单词?

[英]how to extract word like d1234-5678-c9876 from a string using python (regex expression)?

我必须从字符串中找到像 a4546-1234 或 a12344-v23454-32444 这样的词。 我尝试了各种方法来找出答案。

您的示例最直接的正则表达式可能是

re.search("[a-z]?\d+(-[a-z]?\d+)*", mystring)

这将找到可能以字母开头的所有子字符串,后跟多个数字,后跟零个或多个“-”实例、一个可能的字母和多个数字。 但我不知道根据您的问题,这是否真的是您正在寻找的模式。 所有目标字符串的共同点是什么?

进口重新

text='以这个为例 ca365-1234'

text = re.findall('([A-Za-z]+[\\d]+[\\w-] |[\\d-]+[A-Za-z]+[\\w-] )', text )

打印(文本)

我找到了上述问题的解决方案。 这很简单。

这个可以用

str= "llllkkknnnnnnnnna4546-1234bbbbbba12344-v23454-32444nnnn"
text=re.findall('((a[0-9])\w+\-[0-9].\w.)|((a[0-9])\w+\-v[0-9]\w+\-[0-9]\w...)',str)

如果您尝试将某些内容与正则表达式匹配,通常仅编写“匹配部分”是不够的。

通常,您还必须检查“边界条件”,确保匹配的内容不是某些较长文本的一部分。

一个很好的例子是包含在另一个答案中的源字符串llllkkknnnnnnnnna4546-1234bbbbbba12344-v23454-32444nnnn 真的要匹配a4546-... if 前面直接加一个字母吗? 或者你是否接受像a4546-1234这样的匹配,即使它后面直接跟一个字母?

如果没有,你应该添加negative lookbehind开始和negative lookahead到了最后,同时指定“边界条件”。 即你不想在比赛之前/之后发生的事情。

因此,两个环视扩展的正则表达式可以是:

(?<![a-z\d-])[a-z]?\d{4,5}(?:-[a-z]?\d{4,5}){1,2}(?![a-z\d-])

细节:

  • (?<![az\\d-]) - 负向后视:在匹配之前不能有任何字母、数字或减号(请注意,开头或结尾的[]之间的减号不需要反斜杠引号)。
  • [az]?\\d{4,5} - 第一个“组” - 一个字母和 4 或 5 位数字。
  • (?:-[az]?\\d{4,5}){1,2} - 接下来的 1 或 2 个“组”,每个组前面都有一个减号。
  • (?![az\\d-]) - 负前瞻,指定您在比赛后不允许的内容。

可能您还应该使用re.IGNORECASE选项,以禁止(或匹配)大写字母。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM