非连字符的正则表达式匹配 - Python
Posted
技术标签:
【中文标题】非连字符的正则表达式匹配 - Python【英文标题】:Regex Match for Non Hyphenated Words - Python 【发布时间】:2020-03-11 04:50:29 【问题描述】:我正在尝试在 Python 中为非连字符的单词创建一个正则表达式,但我无法找出正确的语法。
正则表达式的要求是:
-
不应包含连字符和
至少应包含 1 个数字
我试过的表达方式是:=
这匹配所有非连字符的单词,但我无法弄清楚如何额外添加第二个条件。^(?!.*-)
我尝试使用双重前瞻,但不确定要使用的语法。这匹配 ID101 但也匹配 ***^(?!.*-(?=/d1,))
应该匹配的示例词: 1DRIVE , ID100 , W1RELESS
不应该匹配的示例词: 基本上是任何非数字字符串(如 STACK、OVERFLOW)或任何连字符(Test-11、24-hours)
附加信息:
我正在使用库 re 并编译正则表达式模式并使用 re.search 进行匹配。
任何帮助都会非常有帮助,因为我是正则表达式匹配的新手,并且在这方面停留了好几个小时。
【问题讨论】:
这是在一个字符串中查找多个还是验证单个“单词”输入? that 为您工作吗? @ctwheels 在我对输入进行标记并删除干扰词之后,它正在搜索一个单词。 Toto、Paul 和 Emma 的所有解决方案都非常适合我的要求!我只能选择一个作为答案。谢谢你们三个! 【参考方案1】:也许,
(?!.*-)(?=.*\d)^.+$
可能工作正常。
测试
import re
string = '''
abc
abc1-
abc1
abc-abc1
'''
expression = r'(?m)(?!.*-)(?=.*\d)^.+$'
print(re.findall(expression, string))
输出
['abc1']
如果您希望简化/修改/探索表达式,在regex101.com 的右上角面板中已对此进行了说明。如果您愿意,您还可以在this link 中观看它如何与一些示例输入匹配。
正则表达式电路
jex.im 可视化正则表达式:
正则表达式 101 解释
/
(?!.*-)(?=.*\d)^.+$
/
gm
Negative Lookahead (?!.*-)
Assert that the Regex below does not match
.* matches any character (except for line terminators)
* Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy)
- matches the character - literally (case sensitive)
Positive Lookahead (?=.*\d)
Assert that the Regex below matches
.* matches any character (except for line terminators)
* Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy)
\d matches a digit (equal to [0-9])
^ asserts position at start of a line
.+ matches any character (except for line terminators)
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
$ asserts position at the end of a line
Global pattern flags
g modifier: global. All matches (don't return after first match)
m modifier: multi line. Causes ^ and $ to match the begin/end of each line (not only begin/end of string)
【讨论】:
你能解释一下吗? 谢谢!它有帮助。【参考方案2】:我想出了-
^[^-]*\d[^-]*$
-
所以我们至少需要一位 (
\d
)
我们需要字符串的其余部分包含除 - ([^-]
) 以外的任何内容
我们可以有无限数量的这些字符,所以[^-]*
但是将它们像[^-]*\d
一样放在一起会在aaa3-
上失败,因为- 出现在有效匹配之后- 让我们确保在我们的匹配之前或之后没有破折号可以潜入^[-]*\d$
不幸的是,这意味着aaa555D
失败。所以我们实际上需要再次添加第一组 - ^[^-]*\d[^-]$
--- 表示开始 - 任意数量的不是破折号的字符 - 一个数字 - 任意数量的不是破折号的字符 - 结束
根据风格,我们也可以使用^([^-]*\d)+$
,因为数字/数字的顺序无关紧要,我们可以拥有任意数量的。
然而,最后......这就是我实际解决这个特定问题的方法,因为正则表达式可能很强大,但它们往往会使代码更难理解......
if ("-" not in text) and re.search("\d", text):
【讨论】:
以上是关于非连字符的正则表达式匹配 - Python的主要内容,如果未能解决你的问题,请参考以下文章