尝试在 Python 中搜索带有 (.*?) 的字符串

Trying to search for a string with (.*?) in Python

我刚接触 Python 3 天,我正在尝试使用 findall() 搜索指定格式后的字符串字符

    >>> nameRegex = re.compile(r'First Name: (.*?) Last Name: (.*?)')
    >>> nameRegex.findall('This is my application for the job. First Name: 
       John Last Name: Johnson DOB 01/01/90')
    >>> [('John', '')]

我意识到我正在使用非贪婪?在组中,否则它也会 return 字符串的 DOB 部分。

有没有一种方法可以格式化为仅使用 Johnson 字符串部分?

由于我是新手,所以我不确定要移动到哪个方向才能获得所需的字符串部分。

在此先感谢大家。

将您的正则表达式更改为

nameRegex = re.compile(r'First Name: (\w*) Last Name: (\w*)')

这使得它匹配所有带有 \w 的 Unicode 单词字符,不包括空格。或者,您可以使用 \S 而不是 \w 来匹配所有非空白字符。有关这些特殊转义序列的参考,请参阅 documentation.

然后输出

[('John', 'Johnson')]

最后用 space 锚定您的正则表达式模式。这应该可以帮助您捕获 Last Name: 之后到下一个 space

之后的所有内容
>>> nameRegex = re.compile(r'First Name: (.*?) Last Name: (.*?) ')
>>> nameRegex.findall('This is my application for the job. First Name: John Last Name: Johnson DOB 01/01/90')
[('John', 'Johnson')]

另一种方法是只使用非空白构造来获取名称

First\s+Name\s*:\s*(\S*)\s+Last\s+Name\s*:\s*(\S*)

https://regex101.com/r/u1LPRD/1

这个问题已经针对单个单词的姓氏和名字得到了回答,但如果事情变得奇怪,它们将不起作用。以下是处理各种名称的方法(除了包含 " Last Name:" 的名字和包含 " DOB" 的姓氏):

nameRegex = re.compile(r'First Name: (.*?) Last Name: (.*?(?= DOB ))')
nameRegex.findall("This is my application for the job. First Name: Mary Beth Last Name: von Sternberg-O'Leary DOB 01/01/90")

这给出了正确的输出:

[('Mary Beth', "von Sternberg-O'Leary")]

正则表达式中看起来很有趣的部分 (.*?(?= DOB )) 称为 "positive lookahead"。简而言之,这使得该组与 (.*? DOB ) 匹配相同的字符串,但从捕获组中丢弃 " DOB "

Here is an intro to lookarounds,一旦熟悉它们,它们将非常有用。