AND/OR 运算符在正则表达式中如何表示?

Posted

技术标签:

【中文标题】AND/OR 运算符在正则表达式中如何表示?【英文标题】:How is the AND/OR operator represented as in Regular Expressions? 【发布时间】:2011-12-22 16:18:53 【问题描述】:

我目前正在编写一个词汇算法来检查用户是否正确输入了单词。我有以下情况: 这个词的正确解决方案是“part1, part2”。 用户应该能够输入“part1”(答案 1)、“part2”(答案 2)或“part1, part2”(答案 3)。 我现在尝试将用户给出的字符串与以下自动创建的正则表达式匹配:

^(part1|part2)$

这只会返回正确的答案 1 和 2,而答案 3 将是错误的。我现在想知道是否有类似于 | 的运算符上面写着and/or 而不是either...or

谁能帮我解决这个问题?

【问题讨论】:

正则表达式可能不是最好的解决方案。我会使用普通的字符串方法。 这个问题没有详细说明。当您只需要与一组合法字符串进行精确的字符串比较时,为什么还要使用模式匹配?除非您的正则表达式编译器像 Perl 那样将备选方案优化为 O(1) trie 结构,否则您可能应该改为针对哈希成员进行测试。其他正则表达式引擎在这方面并不是很聪明。 @tchrist 用例可以是 mongodb $or 正则表达式匹配 【参考方案1】:

我将假设您想要动态构建一个正则表达式以包含除 part1 和 part2 之外的其他单词,并且您希望顺序无关紧要。如果是这样,你可以使用这样的东西:

((^|, )(part1|part2|part3))+$

正面匹配:

part1
part2, part1
part1, part2, part3

否定匹配:

part1,           //with and without trailing spaces.
part3, part2, 
otherpart1

【讨论】:

请注意,“part1, part”1 也是正数。这并不总是可取的 @dimaaan 您是否放错了引号? "part1, part1" 将匹配,但 "part1, part" 不会。尽管您是正确的,此解决方案未涵盖这种情况,但对于他正在检查测试字符串是否由词汇表中的单词组成的 OP 应用程序,我相信即使单词是重复。不管你有多少实例,这个词仍然是词汇表的一部分。【参考方案2】:
'^(part1|part2|part1,part2)$'

有用吗?

【讨论】:

显然。正则表达式要求整个字符串匹配 (^, $)【参考方案3】:

不是正则表达式专家,但您可以使用^((part1|part2)|(part1, part2))$。换句话说:“第 1 部分或第 2 部分或两者兼而有之”

【讨论】:

【参考方案4】:

这是否可以在没有交替的情况下工作?

^((part)1(, \22)?)?(part2)?$

或者为什么不这样?

^((part)1(, (\22))?)?(\4)?$

第一个适用于所有条件,第二个适用于除part2之外的所有条件(使用 GNU sed 4.1.5)

【讨论】:

【参考方案5】:

或者你可以使用这个:

^(?:part[12]|(part)1,\12)$

【讨论】:

【参考方案6】:

使用 如果在 vim 中:

:s/\|/"/g

将替换 和 在 " 所以 lol 变成了“lol”

【讨论】:

以上是关于AND/OR 运算符在正则表达式中如何表示?的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别