尝试在 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*)
这个问题已经针对单个单词的姓氏和名字得到了回答,但如果事情变得奇怪,它们将不起作用。以下是处理各种名称的方法(除了包含 " 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,一旦熟悉它们,它们将非常有用。
我刚接触 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*)
这个问题已经针对单个单词的姓氏和名字得到了回答,但如果事情变得奇怪,它们将不起作用。以下是处理各种名称的方法(除了包含 " 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,一旦熟悉它们,它们将非常有用。