Python regex将获得;字;包含字母和(数字/某些特殊),但不限于数字
简而言之:我想匹配任何包含1个字母和至少1个(数字/某些特殊字符)的“单词”(由空格分隔的连续字符集)。这些“词”可以出现在句子的任何地方 在Python regex将获得;字;包含字母和(数字/某些特殊),但不限于数字,python,regex,Python,Regex,简而言之:我想匹配任何包含1个字母和至少1个(数字/某些特殊字符)的“单词”(由空格分隔的连续字符集)。这些“词”可以出现在句子的任何地方 在python中尝试使用re到目前为止,作为一种模式,我有: \w*[\d@]\w* 这在很大程度上是可行的;然而,我不想让“文字”仅仅是数字/特殊。例: 应匹配: h1DF346 123FE453 3f3g6hj7j5v3 hasdf@asdf r3 r@ 不应匹配: 555555 @ hello onlyletters 无法排除“不应匹配”下的前两个
python
中尝试使用re
到目前为止,作为一种模式,我有:
\w*[\d@]\w*
这在很大程度上是可行的;然而,我不想让“文字”仅仅是数字/特殊。例:
应匹配:
h1DF346
123FE453
3f3g6hj7j5v3
hasdf@asdf
r3
r@
不应匹配:
555555
@
hello
onlyletters
无法排除“不应匹配”下的前两个。感觉这里有些简单的东西我错过了。谢谢 我会使用
|
或这样的运算符:
([A-Za-z]+[\d@]+[\w@]*|[\d@]+[A-Za-z]+[\w@]*)
意思是你想要:
- 字母后接数字@后接任意组合
- 或数字@后跟字母,后跟任意组合
如果在正则表达式的其他部分中使用组,请考虑使用非捕获组
(?:…)
,而不是(…)
。使用类似的前瞻断言
正则表达式:(?=.*[a-zA-Z])(?=.[@#\d])[a-zA-Z\d@+
说明:
测试(?=.*[a-zA-Z])
某物是否后跟一个字母
测试(?=.[@#;\d])
某物是否后跟给定字符类中的一个字符
匹配给定字符类中的一个或多个字符[a-zA-Z\d@#]+
虽然您有了答案,但仍然可以提高已接受正则表达式的速度:
(?=\d++[A-Za-z]+[\w@]+|[a-zA-Z]++[\w@]+)[\w@]{2,}
您需要更新的regex
模块:
import regex as re
string = "h1DF346 123FE453 3f3g6hj7j5v3 hasdf@asdf r3 r@ 555555 @ hello onlyletters"
rx = re.compile(r'(?=\d++[A-Za-z]+[\w@]+|[a-zA-Z]++[\w@]+)[\w@]{2,}')
print(rx.findall(string))
# ['h1DF346', '123FE453', '3f3g6hj7j5v3', 'hasdf@asdf', 'r3', 'r@']
Highjacking@Roberto的演示,您将有一个查找匹配项所需的步骤(>7000对338,~20次)。如果您仅将*(匹配项0或更多)更改为+(匹配项1或更多),您可以正确命中所有内容 \w+[\d@]\w+
除了5555。。。字母和数字的分布是否还有其他模式可以区分?你能用[\d@]之前或之后至少一个字母的要求替换\w来处理它吗?当你说“word”(连续字符集)并使用
\w
时,它也将包含数字。As\w
代表[a-zA-Z0-9\
。还要澄清哪些特殊字符?例如,我发布的模式中的@。至少应该有1个字母,和(1个数字或1@#)-为了简单起见,我刚刚在这里添加了@示例-我不知道我还需要哪些字母,但是看到带@的模式就足够了。这些“单词”是一行中唯一的东西,或者它们可以出现在任何地方?可以出现在行中的任何地方。比如:“你好,123测试世界”应该是123测试感兴趣的!以前从未听说过跳过/失败,并且肯定希望对此进行更多研究。但是,此示例似乎也匹配任何以大写字母开头的单词,它将匹配不应匹配的“@@@”t@NikT:调整后,它不再是了(在你原来的帖子中这仍然不是要求)。给定“NikT”匹配“ikT”,这不应该:PIt匹配“123@”,这不应该;)它不会匹配“r@”,而“r@”应该匹配。它比Rahul的答案需要更少的步骤,而比@Jan的答案需要更多的步骤,因为它不起作用:P@Jan仍然失败:给定的“Jan”匹配不应该匹配的“an;”@Jan匹配的是“123@”,它不应该:)如果能比我的答案提高10倍,我会非常惊讶(并且渴望知道如何做到),因为or'ed正则表达式在第一个字符上应该失败……imo的解决方案是使第一个替代项具有占有性,请参阅此示例,该示例匹配所有所需单词,但保留其余单词(需要338个步骤):