Python正则表达式获取所有内容直到字符串中的第一个点

eal*_*eon 25 python regex

find = re.compile("^(.*)\..*")
for l in lines:
    m = re.match(find, l)
    print m.group(1) 
Run Code Online (Sandbox Code Playgroud)

我希望在字符串中使用正则表达式直到第一个点.

a@b.c,我想a@b
a@b.c.d,我想a@b
a@b.c.d.e,我想a@b

我的代码给了我什么......

  • a@b.c 版画 a@b
  • a@b.c.d 版画 a@b.c
  • a@b.c.d.e 版画 a@b.c.d

应该找到什么才能得到@ b?

Roh*_*ain 41

默认情况下,所有量词都是贪婪的.从某种意义上说,他们会尽量消耗尽可能多的字符串.你可以通过追加它们来使它们不情愿?:

find = re.compile(r"^(.*?)\..*")
Run Code Online (Sandbox Code Playgroud)

如评论中所述,如果字符串中没有句点,则此方法将失败.所以,这取决于你希望它的表现方式.但是如果你想在这种情况下得到完整的字符串,那么你可以使用一个否定的字符类:

find = re.compile(r"^([^.]*).*")
Run Code Online (Sandbox Code Playgroud)

它会在遇到第一个句点后或字符串的结尾处自动停止.


你也不想使用re.match()那里.回覆.search()应该没问题.您可以将代码修改为:

find = re.compile(r"^[^.]*")

for l in lines:
    print re.search(find, l).group(0)
Run Code Online (Sandbox Code Playgroud)

在ideone上演示


Jer*_*rry 32

.find()在这种情况下,您可以使用而不是正则表达式:

>>> s = "a@b.c"
>>> print(s[0:s.find('.')])
a@b
Run Code Online (Sandbox Code Playgroud)

考虑到这些注释,这里有一些修改使用.index()(它类似于.find()除了当没有匹配的字符串而不是-1时它返回错误):

>>> s = "a@b.c"
>>> try:
...     index = s.index('.')
... except ValueError:
...     index = len(s)
...
>>> print(s[:index])
a@b
Run Code Online (Sandbox Code Playgroud)

  • 如果没有点,则会产生奇怪的结果:它返回没有最后一个字符的`s`.如果这个问题可能更简单,`try:index = s.index('.')除了ValueError:index = len(s)` (5认同)
  • +1 - 这是一个优秀而有效的解决方案,不需要导入.太好了! (4认同)

Esc*_*alo 6

您可以使用以下split方法:在字符处拆分字符串.一次,您将得到一个元组(在第一个句点之前,在第一个句点之后)。符号是:

mystring.split(".", 1)
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地创建一个生成器来“产生”你感兴趣的部分,并忽略你不感兴趣的部分(_符号)。它的工作原理如下:

entries = [
    "a@b.c",
    "a@b.c.d",
    "a@b.c.d.e",
    ]

for token, _ in (entry.split(".", 1) for entry in entries):
    print token
Run Code Online (Sandbox Code Playgroud)

输出:

a@b
a@b
a@b
Run Code Online (Sandbox Code Playgroud)

split方法的文档可以在网上找到:

str.split([sep[, maxsplit]])

返回字符串中单词的列表,sep用作分隔符字符串。如果maxsplit给出,则最多进行 maxsplit拆分(因此,列表最多maxsplit+1 包含元素)。如果maxsplit未指定或 -1,则分割次数没有限制(进行所有可能的分割)。