正则表达式匹配单词和撇号

时间:2010-04-08 00:53:45

标签: regex python-3.x

更新:根据有关我的问题含糊不清的评论,我已经增加了问题的细节。

(术语:用语言来指代任何一系列字母数字字符。)

我正在寻找一个正则表达式来匹配以下内容,逐字:

  • 词。
  • 开头的一个撇号的单词。
  • 在整个中间任意数量的非连续撇号的单词。
  • 最后带有一个撇号的单词。

我想匹配以下内容,但不是逐字逐句,而是删除撇号:

  • 在开头和结尾带有撇号的单词将与单词匹配,不带撇号。因此'foo'将与foo匹配。
  • 在中间有多个连续撇号的单词将被解析为两个不同的单词:连续撇号之前的片段和连续撇号之后的片段。因此,foo''bar将与foobar匹配。
  • 在开头或结尾处具有多个连续撇号的单词将与单词匹配,而不带撇号。因此,''foo将与foo''foo''foo匹配。

实施例 这些将是逐字匹配的:

  • 'bout
  • it's
  • persons'

但这些将被忽略:

  • '
  • ''

并且,对于'open'open将匹配。

5 个答案:

答案 0 :(得分:20)

尝试使用:

(?=.*\w)^(\w|')+$

'bout     # pass
it's      # pass
persons'  # pass
'         # fail
''        # fail

正则表达式解释

NODE      EXPLANATION
  (?=       look ahead to see if there is:
    .*        any character except \n (0 or more times
              (matching the most amount possible))
    \w        word characters (a-z, A-Z, 0-9, _)
  )         end of look-ahead
  ^         the beginning of the string
  (         group and capture to \1 (1 or more times
            (matching the most amount possible)):
    \w        word characters (a-z, A-Z, 0-9, _)
   |         OR
    '         '\''
  )+        end of \1 (NOTE: because you're using a
            quantifier on this capture, only the LAST
            repetition of the captured pattern will be
            stored in \1)
  $         before an optional \n, and the end of the
            string

答案 1 :(得分:3)

/('\w+)|(\w+'\w+)|(\w+')|(\w+)/
  • '\ w + 匹配'后跟一个或多个字母字符,或者
  • \ w +'\ w + Matche sone或更多字母字符后跟'后跟一个或多个字母字符,或
  • \ w +'匹配一个或多个字母字符,后跟'
  • \ w + 匹配一个或多个字母字符

答案 2 :(得分:1)

这个怎么样?

'?\b[0-9A-Za-z']+\b'?

编辑:以前的版本不包括两侧的撇号。

答案 3 :(得分:0)

我提交了第二个回答,因为看起来这个问题已经发生了很大的变化,我之前的回答已经不再有效了。无论如何,如果列出所有条件,请尝试:

(((?<!')')?\b[0-9A-Za-z]+\b('(?!'))?|\b[0-9A-Za-z]+('[0-9A-Za-z]+)*\b)

答案 4 :(得分:0)

这很好用

 ('*)(?:'')*('?(?:\w+'?)+\w+('\b|'?[^']))(\1)

这个数据没问题

    'bou
    it's
    persons'
    'open'
    open
    foo''bar
    ''foo
    bee''
    ''foo''
    '
    ''

对这些数据你应该去掉结果(从匹配中删除空格)

    'bou it's persons' 'open' open foo''bar ''foo ''foo'' ' ''

(在监管机构中测试,结果为2美元)