Py学习  »  Jean-François Fabre  »  全部回复
回复总数  11

我会用这个表达:

re.findall(r"\bT\w*?T\b",s))
  • 使用单词边界
  • 使用任意数量的 \w 避免两者之间出现匹配的空格
  • 使用“非贪婪”模式(这里可能没有那么有用,因为word boundary已经完成了这项工作)
3 年前
回复了 Jean-François Fabre 创建的主题 » 在这种情况下,如何在Python中使用replace()函数?

切片字符串并仅在您感兴趣的切片上替换,重建字符串。

>>> s = "Land grade 4 year 3 4 members at building 4"
>>> s[0:20]+s[20:24].replace("4","3.5")+s[24:]
'Land grade 4 year 3 3.5 members at building 4'

如果只更换一个,可能会稍微好一点,这样可以避免字符串切片:

>>> s[0:20]+s[20:].replace("4","3.5",1)
'Land grade 4 year 3 3.5 members at building 4'

但是如果你确切地知道要替换的数字在哪里,那可能是因为你可以用一个模板字符串来替换。

s = "Land grade 4 year 3 {} members at building 4"
s.format(3.5)
5 年前
回复了 Jean-François Fabre 创建的主题 » python切片的奇怪行为

a[3:8:-1] 指示python从3开始,按-1的步骤转到8

这将创建一个空列表:通过添加 -1 (就像 list(range(3,8,-1)) 这也给出了一个空列表)

当你这样做的时候 a[:5:-1] 然后start是默认的start,python将其设置为“end of list”,这样它就“工作了”

和你一样 a[::-1] start&stop是默认的,python知道它们是从头到尾的(否则这个符号将不可用)

6 年前
回复了 Jean-François Fabre 创建的主题 » 按时间对csv行进行排序,python格式为“oct 03 10:06:20”

不要将日期与其他数据分离。重新整理排序键,使其占据行的第二项,并将行传递给它。

它应该做到:

result = sorted(df.iterrows(),key=lambda row: datetime.strptime(row[1], "%b %d %H:%M:%S"))
6 年前
回复了 Jean-François Fabre 创建的主题 » 替换字符串第一个字母的python代码:字符串索引错误

你得到的问题是因为有些行是空的。

那么你的替代品错了:

  • 首先,因为它将指定行的第一个“字符”,但不能更改字符串,因为它是不可变的。
  • 第二个原因是替换值是整个字符串减去一些破折号
  • 第三是因为 line 在下一个迭代中丢失。顺便说一下,原始的行列表也是。

如果要删除字符串的第一个字符,则无需 replace ,只需分割字符串(不要冒险删除其他类似字符)。

一个有效的解决方案是用 startswith 并重新生成一个新的字符串列表。然后回来

text = """hello
-yes--
who are you"""

new_text = []

for line in text.splitlines():
    if line.startswith("-"):
        line = line[1:]
    new_text.append(line)

print("\n".join(new_text))

结果:

hello
yes--
who are you

使用更多的经验,您可以将此代码打包为列表理解:

new_text = "\n".join([line[1:] if line.startswith("-") else line for line in text.splitlines()])

最后,正则表达式模块也是一个不错的选择:

import re
print(re.sub("^-","",text,flags=re.MULTILINE))

这将删除以破折号开头的所有行上的破折号。多行标志告诉正则表达式引擎要考虑 ^ 作为行的开始,而不是缓冲区的开始。

6 年前
回复了 Jean-François Fabre 创建的主题 » python身份危机为什么l或x复制0不使新的0[复制]

如评论中所述,它是某个地方的参考副本。由于您有两个以上的级别,因此不能仅通过滥用 [:] .

实现正确结构创建的最快、最恶毒的方法是删除所有循环和副本(即使它们有效,也可能会使用 copy.deepcopy() 例如)并使用 嵌套列表理解 :

 z = [[[0]*size for _ in range(size)] for _ in range(size)]

内部层可以使用 [0]*size 因为整数是不可变的,所以不需要 [0 for _ in range(size)] 正如我们有时看到的。

所以,一条线,清晰,快速。用它。

6 年前
回复了 Jean-François Fabre 创建的主题 » python使用if语句验证多个值

为什么不使用 all 列/检查值的压缩列表?

if all(value[col] == check for col,check in zip((col1,col2),(check1,check2))):

如果你有更多的参数,我建议你:

def validate(self, data, check1, check2, col1, col2):

进入之内

def validate(self, data, check_values, columns):

所以你可以适应:

if all(value[col] == check for col,check in zip(columns,check_values)):

而且,由于这些值和列是链接的,所以可以直接传递元组列表或将它们链接在一起的字典 validate .

6 年前
回复了 Jean-François Fabre 创建的主题 » 编写一个python程序,在列表的每个元素之前插入一个元素

chain 各种方法不是问题所在,您的问题归结为:

>>> a = zip([1],[2])
>>> list(a)
[(1, 2)]
>>> list(a)
[]

一旦你迭代了 zip_iter 变量,它第二次什么都不产生,就是这样 zip 作品( range 例如,可以多次迭代,但这是因为它将整数作为参数,而不是iterable,在第二次运行时可能会耗尽这些参数…)

最后一个例子之所以有效,是因为您正在创建一个新的 拉链 对象。

6 年前
回复了 Jean-François Fabre 创建的主题 » 如何在python中删除字符串中的某些空格?[副本]

可以使用正则表达式并将表达式配置为将n个或多个空格/换行符/制表符/空格替换为一个空格:

import re

s = "hello     \n   world"
print(re.sub("\s{4,}"," ",s))

印刷品:

hello world

在这里,它将删除所有空格/换行符/制表符/任何内容( \s 在regex中)如果其中至少有4个,并且将仅替换为一个空格(为了避免在替换后对分隔的单词进行排序,可以将其替换为换行符或无字符)。

6 年前
回复了 Jean-François Fabre 创建的主题 » runtimeerror:在python中迭代期间字典更改了大小

如果创建查找字典:

gender_lookup = { 'F' : 1, 'M' : 0 }

然后,您可以使用字典理解更新其他字典:

updated = { student_id : gender_lookup[gender] for student_id,gender in Gender_dict.items() } 
6 年前
回复了 Jean-François Fabre 创建的主题 » runtimeerror:在python中迭代期间字典更改了大小

在迭代字典时,完全可以 改变 现有的 关键。

您不能做的是:添加或删除键。

你不小心用了 价值 以字典为键,创建额外的键并生成错误消息。

一般来说,这种 完整的听写更新 最好使用字典理解,覆盖旧字典:

Gender_dict = {Student_ID:"1" if Gender == "F" else "M" for Student_ID, Gender in Gender_dict.items()}