从 Python 中的一列字符串中提取连续的大写单词
Extract consecutive uppercase words from a column of strings in Python
我有一列字符串,我希望从中提取出现在不同情况下的所有连续大写单词。这是我拥有的字符串类型的示例:
data = pd.DataFrame({
'strings': ['ubicado en QUINTA CALLE, LADO NORTE detras',
'encuentra por AVENIDA NORTE, ARRIBA DE IGLESIA frente a',
'direccion en CENTRO COMERCIAL, SEGUNDO NIVEL junto a']
})
小写单词出现的频率足以将它们用作正则表达式。这是我到目前为止所做的示例:
df['extraction'] = df['strings'].str.extract('(?:(?<=ubicado en )|(?<=encuentra por )|(?<=direccion en ))(.*?)(?:(?=\s*detras)|(?=\s*frente\s*a)|(?=\s*junto\s*a))')
但是,我想找到一种方法,只使用第一个小写单词,然后应用一个正则表达式来抓取所有连续的大写单词。
这是我正在寻找的示例:
df['extraction'] = df['strings'].str.extract('(ubicado\s*en\s*<REGEX>|encuentra\s*por\s*<REGEX>|direccion\s*en\s*<REGEX>)')
结果如下:
data = pd.DataFrame({
'extraction': ['QUINTA CALLE, LADO NORTE',
'AVENIDA NORTE, ARRIBA DE IGLESIA',
'CENTRO COMERCIAL, SEGUNDO NIVEL']
})
字符串实际上是更长更复杂的文本,所以我不能简单地删除列中的所有小写字母。
您可以使用以下内容:
words = '(?:ubicado|encuentra|direccion)'
regex = words+'[^A-Z]*([^a-z]+)'
data['extraction'] = data['strings'].str.extract(regex)
输出:
strings extraction
0 ubicado en QUINTA CALLE, LADO NORTE detras QUINTA CALLE, LADO NORTE
1 encuentra por AVENIDA NORTE, ARRIBA DE IGLESIA frente a AVENIDA NORTE, ARRIBA DE IGLESIA
2 direccion en CENTRO COMERCIAL, SEGUNDO NIVEL junto a CENTRO COMERCIAL, SEGUNDO NIVEL
或者,为了避免尾随 non-letter 个字符:
words = '(?:ubicado|encuentra|direccion)'
regex = words+'[^A-Z]*([^a-z]*[A-Z]+)'
data['extraction'] = data['strings'].str.extract(regex)
输出:
strings extraction
0 ubicado en QUINTA CALLE, LADO NORTE detras QUINTA CALLE, LADO NORTE
1 encuentra por AVENIDA NORTE, ARRIBA DE IGLESIA frente a AVENIDA NORTE, ARRIBA DE IGLESIA
2 direccion en CENTRO COMERCIAL, SEGUNDO NIVEL junto a CENTRO COMERCIAL, SEGUNDO NIVEL
您可以使用自定义函数来检查每个字符的大写字母。然后在 DataFrame 中的每个单元格上使用 lambda 函数:
import pandas as pd
def check_upper(str):
output = []
for x in str:
if x.isupper() or x==" " or x==",":
output.append(x)
return "".join(output).strip().strip(",")
data = pd.DataFrame({
'strings': ['ubicado en QUINTA CALLE, LADO NORTE detras',
'encuentra por AVENIDA NORTE, ARRIBA DE IGLESIA frente a',
'direccion en CENTRO COMERCIAL, SEGUNDO NIVEL junto a']
})
data["strings"] = data["strings"].apply(lambda x: check_upper(x))
data
输出:
strings
0 QUINTA CALLE, LADO NORTE
1 AVENIDA NORTE, ARRIBA DE IGLESIA
2 CENTRO COMERCIAL, SEGUNDO NIVEL
我有一列字符串,我希望从中提取出现在不同情况下的所有连续大写单词。这是我拥有的字符串类型的示例:
data = pd.DataFrame({
'strings': ['ubicado en QUINTA CALLE, LADO NORTE detras',
'encuentra por AVENIDA NORTE, ARRIBA DE IGLESIA frente a',
'direccion en CENTRO COMERCIAL, SEGUNDO NIVEL junto a']
})
小写单词出现的频率足以将它们用作正则表达式。这是我到目前为止所做的示例:
df['extraction'] = df['strings'].str.extract('(?:(?<=ubicado en )|(?<=encuentra por )|(?<=direccion en ))(.*?)(?:(?=\s*detras)|(?=\s*frente\s*a)|(?=\s*junto\s*a))')
但是,我想找到一种方法,只使用第一个小写单词,然后应用一个正则表达式来抓取所有连续的大写单词。
这是我正在寻找的示例:
df['extraction'] = df['strings'].str.extract('(ubicado\s*en\s*<REGEX>|encuentra\s*por\s*<REGEX>|direccion\s*en\s*<REGEX>)')
结果如下:
data = pd.DataFrame({
'extraction': ['QUINTA CALLE, LADO NORTE',
'AVENIDA NORTE, ARRIBA DE IGLESIA',
'CENTRO COMERCIAL, SEGUNDO NIVEL']
})
字符串实际上是更长更复杂的文本,所以我不能简单地删除列中的所有小写字母。
您可以使用以下内容:
words = '(?:ubicado|encuentra|direccion)'
regex = words+'[^A-Z]*([^a-z]+)'
data['extraction'] = data['strings'].str.extract(regex)
输出:
strings extraction
0 ubicado en QUINTA CALLE, LADO NORTE detras QUINTA CALLE, LADO NORTE
1 encuentra por AVENIDA NORTE, ARRIBA DE IGLESIA frente a AVENIDA NORTE, ARRIBA DE IGLESIA
2 direccion en CENTRO COMERCIAL, SEGUNDO NIVEL junto a CENTRO COMERCIAL, SEGUNDO NIVEL
或者,为了避免尾随 non-letter 个字符:
words = '(?:ubicado|encuentra|direccion)'
regex = words+'[^A-Z]*([^a-z]*[A-Z]+)'
data['extraction'] = data['strings'].str.extract(regex)
输出:
strings extraction
0 ubicado en QUINTA CALLE, LADO NORTE detras QUINTA CALLE, LADO NORTE
1 encuentra por AVENIDA NORTE, ARRIBA DE IGLESIA frente a AVENIDA NORTE, ARRIBA DE IGLESIA
2 direccion en CENTRO COMERCIAL, SEGUNDO NIVEL junto a CENTRO COMERCIAL, SEGUNDO NIVEL
您可以使用自定义函数来检查每个字符的大写字母。然后在 DataFrame 中的每个单元格上使用 lambda 函数:
import pandas as pd
def check_upper(str):
output = []
for x in str:
if x.isupper() or x==" " or x==",":
output.append(x)
return "".join(output).strip().strip(",")
data = pd.DataFrame({
'strings': ['ubicado en QUINTA CALLE, LADO NORTE detras',
'encuentra por AVENIDA NORTE, ARRIBA DE IGLESIA frente a',
'direccion en CENTRO COMERCIAL, SEGUNDO NIVEL junto a']
})
data["strings"] = data["strings"].apply(lambda x: check_upper(x))
data
输出:
strings
0 QUINTA CALLE, LADO NORTE
1 AVENIDA NORTE, ARRIBA DE IGLESIA
2 CENTRO COMERCIAL, SEGUNDO NIVEL