在python中将包含在%%中的字符串转换为小写

Posted

技术标签:

【中文标题】在python中将包含在%%中的字符串转换为小写【英文标题】:Convert string enclosed in %% to lower case in python 【发布时间】:2017-11-29 19:24:56 【问题描述】:

我有 pyspark 数据框,其中一个字段的值包含在 %%..%% 内。所附内容不按大小写。我想把它们转换成小写。

下面是数据帧的快照。

列中的文字是这样的

https://www.xxxxxxxx.co.nz/Activities|http://www.xxxxxxxx.co.nz/things-to-do/search?location=%%t.Trip_Intrip_1_dest_City_1%%

https://images.trvl-media.com/media/content/expus/email/2016/us/banner/images/image_stor-34461_09_600x250.jpg|%%mis_lx_Offers_mod_Images.LargeImageURL%%

我想把上面的文字转换成如下格式:

https://www.xxxxxxxx.co.nz/Activities|http://www.xxxxxxxx.co.nz/things-to-do/search?location=%%t.trip_intrip_1_dest_city_1%%

https://images.trvl-media.com/media/content/expus/email/2016/us/banner/images/image_stor-34461_09_600x250.jpg|%%mis_lx_offers_mod_images.largeimageurl%%

只有用 %% 括起来的字符串会被转换为小写

【问题讨论】:

LargeImageUrl 的文字在您的问题中仍然不是全部小写 你不能不映射它并做一个.split("%%")然后.lower()吗? @theBrainyGeek对不起,这是一个错字。做出改变。谢谢。 @16num 我不想拆分列中的内容。如果我拆分它,那么我将不得不将它们重新组合在一起 【参考方案1】:

由于字符串在 Python 中是不可变的,因此您必须重新分配新值。因此,我认为,你最好只遍历字符串(因为在 cmets 中你说你想避免split)。 我在想这样的事情

new=''
f=0
for i in textstr:
    if i == '%':
        f += 1
    if (f/2)%2 == 1:
        new+=i.lower()
    else:
        new+=i

或者使用正则表达式

【讨论】:

【参考方案2】:

你可以使用一个简单的正则表达式:

查找所有要替换的序列 用对应的小写字母替换每个序列
import re

link1 = 'https://images.trvl-media.com/media/content/expus/email/2016/us/banner/images/image_stor-34461_09_600x250.jpg|%%mis_lx_Offers_mod_Images.LargeImageURL%%'
link2 = 'https://www.xxxxxxxx.co.nz/Activities|http://www.xxxxxxxx.co.nz/things-to-do/search?location=%%t.Trip_Intrip_1_dest_City_1%%'
links = [link1, link2]

for idx, link in enumerate(links):
    lowers = re.findall(r'%%.*?%%', link)
    for x in lowers:
        links[idx] = re.sub(r'%%.*?%%', x.lower(), link)

for link in links:
    print(link)

输出:

https://images.trvl-media.com/media/content/expus/email/2016/us/banner/images/image_stor-34461_09_600x250.jpg|%%mis_lx_offers_mod_images.largeimageurl%%
https://www.xxxxxxxx.co.nz/Activities|http://www.xxxxxxxx.co.nz/things-to-do/search?location=%%t.trip_intrip_1_dest_city_1%%

【讨论】:

谢谢。如果只有 1 %% 封闭字符串,我尝试了您的方法及其工作。但是如果有 2 个喜欢说 %%mis_lx_Offers_mod_Images.LargeImageURL%%|https://www.xxxxxxxx.co.nz/Activities|http://www.xxxxxxxx.co.nz/things-to-do/search?location=%%t.Trip_Intrip_1_dest_City_1%% 它会重复循环中的最后一个值。输出变为:|%%t.trip_intrip_1_dest_city_1%%|https://www.xxxxxxxx.co.nz/Activities|http://www.xxxxxxxx.co.nz/things-to-do/search?location=%%t.trip_intrip_1_dest_city_1%%【参考方案3】:

使用@mentalita 建议的正则表达式

输入_df:

>>> df.show(truncate=False)
+----+---------------------------------+
|col1|col2                             |
+----+---------------------------------+
|1   |http://%%FOO%%|some_string%%BAR%%|
|2   |http://%%FOO%%|some_string       |
+----+---------------------------------+

代码:

def convert_to_lower(link):
    target_strings = re.findall(r'%%.*?%%', link)
    for x in target_strings:
            link = re.sub(x, x.lower(), link)
    return link

convert_to_lower_udf = F.udf(lambda x: convert_to_lower(x))
df = df\
    .withColumn('converted_strings', convert_to_lower_udf('col2'))

输出_df:

>>> df.show(truncate=False)
+----+---------------------------------+---------------------------------+
|col1|col2                             |converted_strings                |
+----+---------------------------------+---------------------------------+
|1   |http://%%FOO%%|some_string%%BAR%%|http://%%foo%%|some_string%%bar%%|
|2   |http://%%FOO%%|some_string       |http://%%foo%%|some_string       |
+----+---------------------------------+---------------------------------+

【讨论】:

以上是关于在python中将包含在%%中的字符串转换为小写的主要内容,如果未能解决你的问题,请参考以下文章

在C中将char从大端转换为小端

在python中读/写字典到csv文件

如何在 Python 中将变量转换为 denary? [复制]

如何在python中将数组字符串转换为数组[重复]

在python中将空格分隔文件转换为逗号分隔值文件

如何在python中将数据帧中的符号转换为浮点数?