【问题标题】:regex to match string with a minimum number of words正则表达式以匹配具有最少单词数的字符串
【发布时间】:2014-01-05 02:10:37
【问题描述】:

我需要一个正则表达式来匹配至少包含 X 个单词的字符串(其中一个单词被定义为任何连续的非空白序列)。

我正在使用re.findall()

【问题讨论】:

  • 你有什么尝试吗?
  • 我似乎正在遭受灾难性的回溯。
  • 对不起,但没有任何尝试,这看起来像“请做我的功课”
  • 你太成熟了,对我所有的问题都投了反对票。

标签: python regex python-3.x


【解决方案1】:

嗯,你可以使用字符类\S+来指定一个词。

\S 等价于 [^\s],它本身就等价于 [^ \v\t\f\n\r](按我输入的顺序:空格、垂直制表符、水平制表符、换页、换行符、回车)。

[^ ... ] 表示一个否定类,所有字符都将被匹配,除了类内的字符。

现在,对于你想要做的事情,我宁愿像这样使用re.match

re.match(r'\s*\S+(?:\s+\S+){X-1,}', text_to_validate)

(?:\s+\S+) 匹配空格后跟一个单词。

{X-1,} 表示组 (?:\s+\S+) 应该至少出现 X-1 次才能匹配。如果 X=4,则变为{3,}

ideone demo


交替,按空格分割并计算元素的数量:

re.split(r"\s+", text_to_validate)

ideone demo

【讨论】:

  • “0 次或多次”不是暗示您将匹配一串 X 连续的非空白字符吗?你会如何使用 re.findall?
  • @eyaler 抱歉,我编辑了正则表达式。我忽略了一些非常重要的事情。对于您的第一个问题,不,\S+ 的存在迫使正则表达式至少匹配一个单词。对于第二个问题,您可以使用相同的正则表达式。这只是您检查text_to_validate 是否通过的方式。 re.match 返回一个对象,re.findall 返回一个列表。
  • @eyaler 不确定我提出的解决方案是否有任何问题,但我在答案中添加了一个演示。
  • findall 应该在单个匹配中匹配整个字符串,为此您需要在匹配字符串之后添加 .*。我最终使用: re.findall(r'.*?\S(?:\s+\S+){' + str(X-1) + '}.*?', text)
  • @eyaler 你不需要把那些.*?。您只是忘记了量词中的,,这使得它在没有.*? 的情况下工作:re.findall(r'\s*\S(?:\s+\S+){' + str(X-1) + ',}', text).*? 可能会很慢,但如果性能不影响您,没关系。
【解决方案2】:
import re

subject = """I need a regex to match a string only if it contains at least X words.
Where a word is defined as any continuous non-whitespace sequence.
I am using Python 3 and re.findall()"""

result = re.findall(r"([\S]+)", subject)

if len(result) > 5:
    print "yes"
else:
    print "no"

http://labs.codecademy.com/

【讨论】:

  • findall 应该在单个匹配中匹配整个字符串
猜你喜欢
  • 2014-07-09
  • 2021-05-23
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多