代码之家  ›  专栏  ›  技术社区  ›  Steven

查找并拆分单词后面的某些字符

  •  0
  • Steven  · 技术社区  · 6 年前

    我试图使用正则表达式来拆分标点符号上的文本,只有当标点符号跟随一个单词并在字符串的结尾或空格处前进时。

    ([a-zA-Z])([,;.-])(\s|$)

    但当我想用Python拆分时,它包含了单词的最后一个字符。

    我想这样分开:

    text = 'Mr.Smith is a professor at Harvard, and is a great guy.'
    splits = ['Mr.Smith', 'is', 'a', 'professor', 'at', 'Harvard', ',', 'and', 'a', 'great', 'guy', '.']
    

    0 回复  |  直到 6 年前
        1
  •  2
  •   galaxyan    6 年前

    似乎你想做标记化。尝试 nltk

    http://text-processing.com/demo/tokenize/

    from nltk.tokenize import TreebankWordTokenizer
    splits = TreebankWordTokenizer().tokenize(text)
    
        2
  •  2
  •   Wiktor Stribiżew    6 年前

    你可以用

    re.findall(r'\w+(?:\.\w+)*|[^\w\s]', s)
    

    regex demo

    细节

    • \w+(?:\.\w+)* -1+字字符后跟0个或多个点,后跟1+字字符
    • | -或者
    • [^\w\s]

    Python demo :

    import re
    rx = r"\w+(?:\.\w+)*|[^\w\s]"
    s = "Mr.Smith is a professor at Harvard, and is a great guy."
    print(re.findall(rx, s))
    

    输出: ['Mr.Smith', 'is', 'a', 'professor', 'at', 'Harvard', ',', 'and', 'is', 'a', 'great', 'guy', '.']

    这种方法可以进一步精确化。E、 g.仅将字母、单词、数字和下划线标记为标点符号:

    re.findall(r'[+-]?\d*\.?\d+|[^\W\d_]+(?:\.[^\W\d_]+)*|[^\w\s]|_', s)
    

    regex demo

        3
  •  1
  •   mrzasa    6 年前

    ([.,](?=\s)|\s) 然后过滤空字符串或空字符串:

    In [16]: filter(lambda s: not re.match(r'\s*$', s) , re.split(r'([.,](?=\s)|\s)',  'Mr.Smith is a professor at Har
        ...: vard, and is a great guy.'))
    Out[16]: 
    ['Mr.Smith',
     'is',
     'a',
     'professor',
     'at',
     'Harvard',
     ',',
     'and',
     'is',
     'a',
     'great',
     'guy.']