Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的价格解析-如何在第一次出现任何数字之前将列表中的所有字符串拆分一次?_Python_String_List Comprehension - Fatal编程技术网

python中的价格解析-如何在第一次出现任何数字之前将列表中的所有字符串拆分一次?

python中的价格解析-如何在第一次出现任何数字之前将列表中的所有字符串拆分一次?,python,string,list-comprehension,Python,String,List Comprehension,我有一个字符串列表,如下所示: 输入: prices_list = ["CNY1234", "$ 4.421,00", "PHP1,000", "€432"] ["1234", "4.421,00", "1,000", "432"] ['1234', '$ 4.421,00', '1,000', '432'] # $ still in there prices_list = [''.join(re.split("[A-Za-z]", re.sub(r'[^\x00-\x7F]+',''

我有一个字符串列表,如下所示:

输入:

prices_list = ["CNY1234", "$ 4.421,00", "PHP1,000", "€432"]
["1234", "4.421,00", "1,000", "432"]
['1234', '$ 4.421,00', '1,000', '432']   # $ still in there
prices_list = [''.join(re.split("[A-Za-z]", re.sub(r'[^\x00-\x7F]+','', price).encode("utf-8").strip())) for price in price_list]
prices_list = [''.join(token) for token in price for price in price_list if token.isdigit() or token == ',|;']
我想删除除。
isdigit()
。|,'
之外的所有内容。换句话说,我希望在第一次出现
maxslit=1的任何数字之前进行拆分:

所需输出:

prices_list = ["CNY1234", "$ 4.421,00", "PHP1,000", "€432"]
["1234", "4.421,00", "1,000", "432"]
['1234', '$ 4.421,00', '1,000', '432']   # $ still in there
prices_list = [''.join(re.split("[A-Za-z]", re.sub(r'[^\x00-\x7F]+','', price).encode("utf-8").strip())) for price in price_list]
prices_list = [''.join(token) for token in price for price in price_list if token.isdigit() or token == ',|;']
第一次尝试(两次正则表达式替换)

# Step 1: Remove special characters
prices_list = [re.sub(r'[^\x00-\x7F]+',' ', price).encode("utf-8") for price in prices_list]
# Step 2: Remove [A-Aa-z]
prices_list = [re.sub(r'[A-Za-z]','', price).strip() for price in prices_list]
电流输出:

prices_list = ["CNY1234", "$ 4.421,00", "PHP1,000", "€432"]
["1234", "4.421,00", "1,000", "432"]
['1234', '$ 4.421,00', '1,000', '432']   # $ still in there
prices_list = [''.join(re.split("[A-Za-z]", re.sub(r'[^\x00-\x7F]+','', price).encode("utf-8").strip())) for price in price_list]
prices_list = [''.join(token) for token in price for price in price_list if token.isdigit() or token == ',|;']
第二次尝试(仍有两个正则表达式替换):

prices_list = ["CNY1234", "$ 4.421,00", "PHP1,000", "€432"]
["1234", "4.421,00", "1,000", "432"]
['1234', '$ 4.421,00', '1,000', '432']   # $ still in there
prices_list = [''.join(re.split("[A-Za-z]", re.sub(r'[^\x00-\x7F]+','', price).encode("utf-8").strip())) for price in price_list]
prices_list = [''.join(token) for token in price for price in price_list if token.isdigit() or token == ',|;']
这(当然)导致了与我第一次尝试相同的输出。此外,这不是很短,看起来很难看。有没有更好(更短)的方法

第三次尝试(为
-循环/无正则表达式列出理解/嵌套的
):

prices_list = ["CNY1234", "$ 4.421,00", "PHP1,000", "€432"]
["1234", "4.421,00", "1,000", "432"]
['1234', '$ 4.421,00', '1,000', '432']   # $ still in there
prices_list = [''.join(re.split("[A-Za-z]", re.sub(r'[^\x00-\x7F]+','', price).encode("utf-8").strip())) for price in price_list]
prices_list = [''.join(token) for token in price for price in price_list if token.isdigit() or token == ',|;']
产生:

NameError: name 'price' is not defined

如何最好地解析上述价目表?

如果您只需要留下特定字符,最好告诉regex完全执行该操作:

import re

prices_list = ["CNY1234", "$ 4.421,00", "PHP1,000", "€432"]

prices = list()
for it in prices_list:
    pattern = r"[\d.|,]+"
    s = re.search(pattern, it)
    if s:
        prices.append(s.group())

> ['1234', '4.421,00', '1,000', '432']

如果您只需要留下特定字符,最好告诉regex完全执行该操作:

import re

prices_list = ["CNY1234", "$ 4.421,00", "PHP1,000", "€432"]

prices = list()
for it in prices_list:
    pattern = r"[\d.|,]+"
    s = re.search(pattern, it)
    if s:
        prices.append(s.group())

> ['1234', '4.421,00', '1,000', '432']
问题 如果我错了,请纠正我,但本质上你是在试图删除符号之类的东西,只留下任何尾随数字,对吗

我想在第一次出现任何数字之前拆分

我觉得,这是构建您试图解决的正则表达式问题的最简单方法

解决办法 这给了我
['1234','4.421,00','1000','432']
作为输出

解释 之所以这样做是因为lambda和map函数。基本上,map函数接受lambda(一个可移植的单行函数,如果您愿意的话),并在列表中的每个元素上执行它。负索引采用
split
方法生成的匹配列表的最后一个元素

本质上,这是因为假设您不希望输出中有任何初始非数字

警告
  • 此代码不仅在结果子字符串中保留
    ,而且在结果子字符串中保留所有字符。因此,
    “$10e7”
    的输入字符串将作为
    “10e7”
    输出

  • 如果您只有数字和
    ,例如
    “10.00”
    作为输入字符串,您将在输出列表的相应位置获得
    '00'

如果这些都不是您想要的行为,那么您必须去掉
regex.split(price,1)
旁边的负索引,并对生成的列表列表进行进一步处理,以便处理使用regex时出现的所有令人讨厌的边缘情况

无论哪种方式,我都会尝试用更多极端的例子来说明,以确保它是您所需要的。

问题 如果我错了,请纠正我,但本质上你是在试图删除符号之类的东西,只留下任何尾随数字,对吗

我想在第一次出现任何数字之前拆分

我觉得,这是构建您试图解决的正则表达式问题的最简单方法

解决办法 这给了我
['1234','4.421,00','1000','432']
作为输出

解释 之所以这样做是因为lambda和map函数。基本上,map函数接受lambda(一个可移植的单行函数,如果您愿意的话),并在列表中的每个元素上执行它。负索引采用
split
方法生成的匹配列表的最后一个元素

本质上,这是因为假设您不希望输出中有任何初始非数字

警告
  • 此代码不仅在结果子字符串中保留
    ,而且在结果子字符串中保留所有字符。因此,
    “$10e7”
    的输入字符串将作为
    “10e7”
    输出

  • 如果您只有数字和
    ,例如
    “10.00”
    作为输入字符串,您将在输出列表的相应位置获得
    '00'

如果这些都不是您想要的行为,那么您必须去掉
regex.split(price,1)
旁边的负索引,并对生成的列表列表进行进一步处理,以便处理使用regex时出现的所有令人讨厌的边缘情况

不管怎样,我都会尝试用更多极端的例子来证明这是你需要的