我有以下列表:
names = ['s06_215','s06_235b','s06_235','s08_014','18:s08_014','s08_056','s08_169']
s06_235b
和s06_235
,s08_014
和18:s08_014
重复。但是,如示例所示,命名中没有特定的模式。我需要对列表元素进行成对比较:
for i in range(0, len(names)-1):
for index, value in enumerate(names):
print names[i], names[index]
然后我需要检查每对,如果两个,包含相同的字符串,但长度超过4
。这是s06_235b
和s06_235
,s08_014
和18:s08_014
会通过此标准,但s08_056
和s08_169
则不会。
我如何在Python中实现这一目标?
答案 0 :(得分:2)
您可以使用某些不属于这些字符串的特殊字符迭代所有combinations
,join
,并使用(\w{5,}).*#.*\1
之类s1 in s2
来查找那对中重复的一组。除了仅使用(\w{5,})
进行测试之外,如果第一个字符串的一部分包含在第二个字符串中,则此功能也可以使用,反之亦然。
这里,\w
是至少5个字符的共享子字符串(在这种情况下来自.*
类,但可以自由调整),后跟更多字符#
分隔符(在这种情况下为.*
),更多填充\1
,然后是第一组p = re.compile(r"(\w{5,}).*#.*\1")
for pair in itertools.combinations(names, 2):
m = p.search("#".join(pair))
if m:
print("%r shares %r" % (pair, m.group(1)))
的另一个实例。
('s06_215', 's06_235b') shares 's06_2'
('s06_215', 's06_235') shares 's06_2'
('s06_235b', 's06_235') shares 's06_235'
('s08_014', '18:s08_014') shares 's08_014'
('s08_014', 's08_056') shares 's08_0'
('18:s08_014', 's08_056') shares 's08_0'
输出:
_
当然,您可以调整正则表达式以满足您的需求。例如,如果您不希望重复区域被p = r"([a-z0-9]\w{3,}[a-z0-9]).*#.*\1"
限制,则可以使用if @@ROWCOUNT > 0 return ;
之类的正则表达式。
答案 1 :(得分:1)
您可以使用'in'运算符来查看变量是否包含另一个
public class Product
{
//private product data
private string productName;
public string getProductName()
{
return this.productName;
}
public void setProductName (string inProductName)
{
this.productName = inProductName;
}
private string customerName;
public string getCustomerName()
{
return this.customerName;
}
public void setCustomerName (string inCustomerName)
{
this.customerName = inCustomerName;
}
private string firmwareLocation;
public string getFirmwareLocation()
{
return this.firmwareLocation;
}
public void setFirmwareLocation (string inFirmwareLocation)
{
this.firmwareLocation = inFirmwareLocation;
}
//constructor
public Product (string inProductName, string inCustomerName, string inFirmwareLocation)
{
productName = inProductName;
customerName = inCustomerName;
firmwareLocation = inFirmwareLocation;
}
//save method
public void Save (System.IO.TextWriter textOut)
{
textOut.WriteLine(productName);
textOut.WriteLine(customerName);
textOut.WriteLine(firmwareLocation);
}
public bool Save (string filename)
{
System.IO.TextWriter textOut = null;
try
{
textOut = new System.IO.StreamWriter(filename);
Save(textOut);
}
catch
{
return false;
}
finally
{
if (textOut != null)
{
textOut.Close();
}
}
return true;
}
试试这个:
private void Add_Click(object sender, RoutedEventArgs e)
{
//get input from user
string inputCustomerName = customerNameTextBox.Text;
string inputProductName = productNameTextBox.Text;
string inputFirmwareLocation = firmwareTextBox.Text;
try
{
Product newProduct = new Product(inputProductName, inputCustomerName, inputFirmwareLocation);
newProduct.Save("products.txt");
MessageBox.Show("Product added");
}
catch
{
MessageBox.Show("Product could not be added");
}
}
编辑: 正如tobias_k所提到的:请注意,这仅在整个字符串包含在另一个字符串
中时才有效