尝试在Python中搜索带(.*)的字符串
我刚接触Python 3天,我正在尝试使用findall()搜索指定格式后的字符串尝试在Python中搜索带(.*)的字符串,python,regex,findall,Python,Regex,Findall,我刚接触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'
>>> 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', '')]
我意识到我在用非贪婪的?在组中,因为否则它也将返回字符串的DOB部分
是否有一种方法可以格式化Johnson字符串部分,而不做更多
因为我是一个新手,所以我不知道该朝哪个方向移动才能得到想要的那部分线
提前感谢所有人。将正则表达式更改为
nameRegex = re.compile(r'First Name: (\w*) Last Name: (\w*)')
这使得它将所有Unicode单词字符与不包含空格的\w
匹配。或者,您可以使用\S
而不是\w
来匹配所有非空白字符。有关这些特殊转义序列的参考,请参阅
然后输出为
[('John', 'Johnson')]
最后用空格锚定正则表达式模式。这将有助于您捕获
姓氏:
之后直到下一个空格的所有内容
>>> 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*)
这个问题已经针对单个单词的姓氏和名字得到了回答,但如果事情变得奇怪,它们就不起作用了。以下是处理各种名称的方法(除了包含
“姓氏:”
的名字和包含“DOB”
的姓氏):
这将提供正确的输出:
[('Mary Beth', "von Sternberg-O'Leary")]
正则表达式中看起来很有趣的位,(.*?(?=DOB))
,称为“正向前瞻”。简单地说,这使组匹配与(.*DOB)
相同的字符串,但从捕获组中丢弃“DOB”
,一旦你熟悉了它们,它们会非常有用。@Thefourthbird为什么
$
?@Thefourthbird然后它也会捕获DOB部分,正如OP所说的那样…我假设部分使用点星后会捕获整个DOB部分。如果只是名字,那当然会超过它。If将删除评论。太棒了,效果非常好。空白锚是如何工作的?*?
是非贪婪的,可以匹配空字符串'
。但是通过用一个空格来锚定它,你说比赛结束后必须有一个空格。因此,满足这个标准的最小匹配是将所有内容匹配到下一个空间,这是有意义的。非常感谢。我没有想到只使用\w*,因为我只是想找一个词,谢谢。这个主意很好,但最好使用一个非贪婪的量词作为姓氏,以确保在行中的第一个“DOB”处停止,并在“DOB”后添加一个空格(用于John DOBSON)。你也可以这样做。((?:(?!DOB)。+)
(一个接一个但贪婪)。@casimimirithippolyte-Ooo,抓得好!另外,这是一个有趣的选择。我总是忘记非捕获组。
[('Mary Beth', "von Sternberg-O'Leary")]