正则表达式模式包括字母、特殊、数字

regex pattern include alpha, special, numeric

以下是我的句子: 例如:

这是第一个:示例 234 -

这是第二个(示例)345 1

这是我的第三个例子(456) 3

预期输出:

['this is first: example', 234, -]
['this is second (example)', 345, 1]
['this is my third example', (456), 3]

我厌倦了使用 python、nltk 单词标记和句子标记、split() 和

str1 = re.compile('([\w: ]+)|([0-9])') str1.findall('my above examples')

请给我建议一个可以提供我预期输出的模块,或者让我知道我在正则表达式中的错误在哪里

用你的表情,你会因为交替而得到不同的匹配。如果您希望在一行中包含三个部分的组,只需创建一个匹配整行的表达式并分别捕获三个部分。例如。

^(.*) ([\d()]+) ([-\d])

请注意,这是有效的,因为当 .* 匹配整行时,引擎会回溯并放弃字符以匹配末尾的数字组。

在代码中:

regex = r"^(.*) ([\d()]+) ([-\d])"
matches = re.findall(regex, your_text, re.MULTILINE)
print(matches)

输出:

[('this is first: example', '234', '-'), 
('this is second (example)', '345', '1'), 
('this is my third example', '(456)', '3')]

编辑

如果您知道最后会有多少组数字,上述模式会很有效。但是,如果该数字是可变的,则您需要创建一个静态数量的重复可选数字组,例如 (?:\d+)? 以预测您必须匹配的值数量,但这很麻烦并且可能仍无法满足弹出的所有要求.

因此,将源中出现的所有数字捕获在一个块中并在之后拆分将是一个更好的选择。为此,我们将使用惰性量词匹配字符串的开头,以允许匹配字符串末尾的所有可用数字组,我们将把它们合为一体。例如:

^(.*?)((?: [-\d()]+)+)$

参见 regex demo

然后我们可以将捕获的一组数字拆分成一个数组,我们将其包含在描述中。示例代码:

import re

test_str = (
    "this is first: example 234 -\n"
    "this is second (example) 345 1\n"
    "this is my third example (456) 3\n"
    "this is the fourth example (456) 4 12\n"
    "this is the fifth example 300 1 16 200 (2) 18")

regex = r"^(.*?)((?: [-\d()]+)+)$"
matches = re.findall(regex, test_str, re.MULTILINE)
captures = [(a, b.split()) for (a, b) in matches]

print(captures)

输出:

[
  ('this is first: example', ['234', '-']), 
  ('this is second (example)', ['345', '1']), 
  ('this is my third example', ['(456)', '3']), 
  ('this is the fourth example', ['(456)', '4', '12']), 
  ('this is the fifth example', ['300', '1', '16', '200', '(2)', '18'])
]