从开始到多字符子字符串的第一次出现都匹配一段文本

时间:2019-06-25 20:47:40

标签: python regex

我希望正则表达式搜索在到达“。”时结束,但不希望在到达“。”时结束。我知道使用[^...]来排除单个字符,并且一直使用它来停止搜索到某个字符。不过,这不适用于字符串,因为[^. ]到达任一字符时都会停止。说我有代码

import re

def main():
    my_string = "The value of the float is 2.5. The int's value is 2.\n"
    re.search("[^.]*", my_string)

main()

哪个匹配对象带有字符串

"The value of the float is 2"

如何更改此设置,使其仅在字符串“。”之后停止?

奖金问题,有没有办法告诉正则表达式在到达多个字符串之一时就停止?以上面的代码为例,如果我希望搜索在找到字符串“。”或字符串“。\ n”时结束,我将如何处理?谢谢!

2 个答案:

答案 0 :(得分:2)

要从字符串的开头到.后跟空格匹配,请使用

^(.*?)\.\s

如果您只想在点后添加空格或换行符,请使用以下两种方法之一(如果只有一个字符,则最好使用第二个字符;如果有多个字符,请使用替代字符)

^(.*?)\.(?: |\n)
^(.*?)\.[ \n]

请参见regex demo

详细信息

  • ^-字符串的开头
  • (.*?)-捕获组1:除换行符以外的任何0+个字符,并且尽可能少
  • \.-文字.字符
  • \s-空格字符
  • (?: |\n) / [ \n]-与空格或(|)换行符匹配的非捕获组。

Python demo

import re

my_string = "The value of the float is 2.5. The int's value is 2.\n"
m = re.search("^(.*?)\.\s", my_string) # Try to find a match
if m:                                  # If there is a match
    print(m.group(1))                  # Show Group 1 value

注意:如果输入中可能存在换行符,请传递re.Sre.DOTALL标志:

m = re.search("^(.*?)\.\s", my_string, re.DOTALL)

答案 1 :(得分:0)

除了Wiktor解释的经典方法外,在这种情况下,拆分也是一种有趣的解决方案。

>>> my_string
"The value of the float is 2.5. The int's value is 2.\n"
>>> re.split('\. |\.\n', my_string)
['The value of the float is 2.5', "The int's value is 2", '']

如果您想在句子的末尾加上句号,可以执行以下操作:

['{}.'.format(sentence) for sentence in re.split('\. |\.\n', my_string) if sentence]

要处理句子之间的多个空格:

>>> str2 = "The value of the float is 2.5.   The int's value is 2.\n\n  "
>>> ['{}.'.format(sentence) 
     for sentence in re.split('\. \s*|\.\n\s*', str2) 
     if sentence
     ]
['The value of the float is 2.5.', "The int's value is 2."]